如何用rails开发coffee脚本



我最近一直在考虑CoffeeScript,我刚刚根据本指南将我正在进行的一个Rails项目升级到Rails 3.2.8(从没有资产管道的Rails 3.0.9升级到了Rails 3.2.8)。

为了让事情正常运转,我不得不做一些琐碎的事情。我正在测试一个新页面"/pages/game",因此它在asset目录中有一些CoffeeScript示例。

(app/assets/javascripts/page.js.coffee)

class MyObject
  constructor: ->
  hello: -> alert 'hello world of coffeescript!'

a = new MyObject
a.hello()

然后,我在生产环境中添加了一行:(配置/环境/生产.rb)

config.assets.precompile += %w( pages.js )    # this is needed to precompile coffee script files... it is difficult to understand how manifest files work...

然后键入

$  bundle exec rake assets:precompile

努力编译page.js唯一的问题是我用CoffeeScript创建的类并没有像我预期的那样工作。因此,我在FireFox中打开了我的开发人员控制台,并试图手动实例化该类,但它的行为就像没有这样的名为MyClass的对象一样。

那么我哪里错了?假设我可以手动实例化我在CoffeeScript中编写的类,这是我的冒昧吗?我在预编译数组中添加pages.js的方法不合适吗?如果你是CoffeeScript专业人士,你会如何测试你的类等等?

更新:我的部分问题是咖啡脚本类中固有的"可变隐私"。这种隐私可以用标准javascript实现,在深入研究coffee脚本之前应该先了解。http://benalman.com/news/2010/11/immediately-invoked-function-expression/

也就是说,coffee脚本类需要附加到窗口对象,以使其全局可访问,如下所示:

已纠正

class MyObject
  constructor: ->
  hello: -> alert 'hello world of coffeescript!'

window.MyObject = MyObject;

一旦在这个庄园中发布了类(通过将其作为全局附加到窗口),就可以通过a = new MyObject()实例化它,然后正常调用它的函数,以向屏幕a.hello()

发出警报

MyObject绝对存在如果您在页面中包含pages.js的内容。您可能需要添加

<%= javascript_include_tag "pages" %>

设置

config.assets.precompile += %w( pages.js )

并将以下内容添加到app/assets/javascripts/application.js.coffee

//= require pages

并确保application.js包含在带有的app/views/layouts/application.html.erb

<%= javascript_include_tag "application" %>

资产管道上的Rails指南非常有用。不过,为了在这里提供一点解释。。。

Rails希望您(默认情况下)在部署到生产环境时将所有javascript打包到一个application.js文件中。Sprockets可用于添加require指令,如上面的指令,以查找、包含和编译列在application.js文件中的文件。

默认情况下,Rails只编译application.jsapplication.cssapp/assetslib/assetsvendor/assets中的任何NON-.js/.css文件。这意味着,除非将pages.js//= require指令添加到application.js文件中,否则Rails将忽略它

这就是为什么您尝试将pages.js添加到要使用config.assets.precompile编译的文件列表中。这个命令明确地告诉Rails编译这个文件,使它可以通过像这样的javascript include使用

<%= javascript_include_tag "pages" %>

我假设您还没有将其放入HTML中。走这条路通常不是你想要的,原因有几个,其中之一是这样做意味着你对Rails试图为你提供的资产管道//= require行的帮助说"不,谢谢"。

因此,任何一种方法都是可行的;您还没有完成将pages.js的内容包含在页面中所需的所有步骤,这就是MyObject不存在的原因。

最新更新