我最近一直在考虑CoffeeScript,我刚刚升级了一个Rails项目,我一直在研究Rails 3.2.8(来自Rails 3.0.9,它没有资产管道){{3} }。
我必须做一些hackish东西才能使事情正常运转。我正在测试一个新页面'/ pages / game',所以它在资产目录中有一些示例CoffeeScript。
(应用程序/资产/ Javascript角/ page.js.coffee)
class MyObject
constructor: ->
hello: -> alert 'hello world of coffeescript!'
a = new MyObject
a.hello()
然后我在生产环境中添加了一行: (配置/环境/ production.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编写的类,这让我很冒昧吗?我的hackish手段是否将pages.js添加到预编译数组中是不合适的?如果您是CoffeeScript专业人士,您将如何测试您的课程等?
更新 我的部分问题是在咖啡脚本课程中不可取的“可变隐私”。这种隐私可以在标准的javascript中实现,并且应该在涉足咖啡脚本之前理解。 this guide
也就是说,需要将咖啡脚本类附加到窗口对象以使其可全局访问,如下所示:
校正的
class MyObject
constructor: ->
hello: -> alert 'hello world of coffeescript!'
window.MyObject = MyObject;
一旦在该庄园中发布了类(通过将其作为全局附加到窗口),可以通过a = new MyObject()
实例化它,然后正常调用其函数以警告屏幕a.hello()
答案 0 :(得分:4)
MyObject
绝对存在如果您在页面中加入pages.js
的内容。您可能需要添加
<%= javascript_include_tag "pages" %>
到您的HTML或不设置
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 Guide 非常有用。尽管如此在这里提供一些解释......
Rails希望您(默认情况下)在部署到生产时将所有javascript打包到单个application.js
文件中。 Sprockets可以让你添加上面的require指令来查找,包含和编译application.js
文件中列出的文件。
默认情况下,Rails只会编译application.js
,application.css
和.js/.css
中的app/assets
,lib/assets
和任何非{ - 1}}文件。这意味着,除非您为vendor/assets
文件添加//= require
pages.js
指令,否则Rails将忽略它。
这就是为什么您尝试将application.js
添加到文件列表以便使用pages.js
进行编译的原因。这告诉Rails明确地编译该文件,使其可以通过javascript包括
config.assets.precompile
我假设您没有放入HTML。走这条路线通常不是出于某些原因,其中一个原因就是这样做,你说“不用了”Rails试图为你提供资产管道<%= javascript_include_tag "pages" %>
行的帮助。 / p>
所以,任何一种方法都是可行的;您还没有完成所有必要的步骤,以便在您的网页中包含//= require
的内容,这就是pages.js
不存在的原因。