如何使用rails开发咖啡脚本

时间:2012-08-31 17:50:46

标签: ruby-on-rails debugging coffeescript asset-pipeline

我最近一直在考虑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()

1 个答案:

答案 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.jsapplication.css.js/.css中的app/assetslib/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不存在的原因。