Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails应用程序其余部分可用的CoffeeScript/JavaScript类和方法集_Javascript_Ruby On Rails_Ruby On Rails 3_Coffeescript_Ruby On Rails 3.2 - Fatal编程技术网

Rails应用程序其余部分可用的CoffeeScript/JavaScript类和方法集

Rails应用程序其余部分可用的CoffeeScript/JavaScript类和方法集,javascript,ruby-on-rails,ruby-on-rails-3,coffeescript,ruby-on-rails-3.2,Javascript,Ruby On Rails,Ruby On Rails 3,Coffeescript,Ruby On Rails 3.2,我使用的是Rails 3.2.9。当我将CoffeeScript代码添加到/app/assets/javascripts目录中的.js.coffee文件中时,我会在所有网页中获得生成的JavaScript。问题在于所有JavaScript都包含在以下内容中: (function() { // my code }).call(this); 因此,我定义的任何方法在我在其他文件中编写的任何其他CoffeeScript代码中都不可见。使用Rails编写一组可重用的CoffeeScript类和方法

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

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

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

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

// 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资产管道配合使用。

此外,您可以在coffeescript文件中定义如下类:

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

这样,定义就附加到全局名称空间。

设置名称空间的正确位置在哪里?application.js?布局视图?@at.:任何首先被击中的地方都可以。我不确定它是否能在
application.js
manifest文件中保存,但我想它会的。你甚至可以在其他脚本标记之前将其放入布局中。我在开始时创建了一个带有
的文件,比如
\u my\u stuff.js.coffee
。通过这种方式,它是在其他代码之前加载的,我可以在依赖它的其他代码之前设置
window.app={}
。这是我一直在搜索的东西。我真的很恼火,因为有了Coffeescript,我用
window.name=name
命名了所有东西。我通常在大多数应用程序中使用Rails 4+,所以Coffeescript对我来说是锦上添花,这让我很开心!