一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法

Posted

技术标签:

【中文标题】一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法【英文标题】:Set of CoffeeScript/JavaScript classes and methods available to rest of Rails app 【发布时间】:2012-11-03 18:23:45 【问题描述】:

我使用的是 Rails 3.2.9。当我将 CoffeeScript 代码添加到 /app/assets/javascripts 目录中的 .js.coffee 文件时,我在所有网页中都得到了生成的 JavaScript。问题是所有的 JavaScript 都包含在:

(function() 
  // my code
).call(this);

所以我定义的任何方法在我在其他文件中编写的任何其他 CoffeeScript 代码中都不可见。用 Rails 编写一组可重用的 CoffeeScript 类和方法的正确方法是什么?

【问题讨论】:

【参考方案1】:

最简单的做法是命名所有类。如果您的应用程序被称为“应用程序”,那么在发生其他任何事情之前在您的初始化代码中:

// Set up the namespace.
window.app =  

然后在您的所有.coffee 文件中:

class app.Pancakes
    #...

然后您将拥有一个全局命名空间,并通过该命名空间引用所有内容:

pancakes = new app.Pancakes

简单的函数也一样:

app.where_is = (pancakes, house) -> ...

# And elsewhere...
x = app.where_is(...)

有多种方法可以设置和部分隐藏命名空间,但它们都是上述方法的变体,简单的命名空间与 Rails 资产管道很好地配合。

【讨论】:

在哪里设置命名空间的正确位置?应用程序.js?布局视图? @at.: 先被击中的任何地方都可以。我不确定它是否会在 application.js 清单文件中存在,但我猜它会。你甚至可以在你的脚本标签的其余部分之前把它放在你的布局中。 我创建了一个以_开头的文件,例如_my_stuff.js.coffee。这样它会在其他所有内容之前加载,我可以在依赖它的其他代码之前设置window.app = 【参考方案2】:

此外,您可以像这样在 coffeescript 文件中定义类:

class this.Person
  constructor: (attr = ) ->
    ...

通过这种方式,定义被附加到全局命名空间。

【讨论】:

这是我一直在寻找的东西。我真的很生气,因为使用 Coffeescript 我用window.name = name 命名所有东西。我通常在大多数应用程序中使用 Rails 4+,所以 Coffeescript 对我来说主要是锦上添花,这让我很开心!

以上是关于一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法的主要内容,如果未能解决你的问题,请参考以下文章

Rails 路径助手在 js.coffee.erb 中不起作用

一组可读的常数参数 C

为啥 rails 对咖啡脚本文件使用 .js.coffee 扩展名,因为它们无论如何都不能包含 JavaScript 代码?

我得到“您的要求无法解决为一组可安装的软件包。”当我运行作曲家更新

配置 Ruby on Rails 以生成 .js 而不是 js.coffee [重复]

如何解决“您的需求无法解析为一组可安装的软件包”