我最近一直在考虑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.js
、application.css
和app/assets
、lib/assets
和vendor/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
不存在的原因。