3

我最近一直在考虑 CoffeeScript,我刚刚按照本指南将我一直在从事的 Rails 项目升级到 Rails 3.2.8(从没有资产管道的 Rails 3.0.9)。

我不得不做一些骇人听闻的事情才能让事情正常工作。我正在测试一个新页面“/pages/game”,因此它在资产目录中有一些示例 CoffeeScript。

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

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


a = new MyObject

a.hello()

然后我在我的生产环境中添加了一行:(config/environments/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 编写的类是不是冒昧的?我将 pages.js 添加到预编译数组的骇人听闻的方法不合适吗?如果您是 CoffeeScript 专业人士,您将如何测试您的课程等?

更新: 我的部分问题是咖啡脚本类中固有的“可变隐私”。这种隐私可以在标准 javascript 中实现,并且在涉足咖啡脚本之前应该理解。 http://benalman.com/news/2010/11/immediately-invoked-function-expression/

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

已更正

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


window.MyObject = MyObject;

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

4

1 回答 1

4

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

<%= 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.erbwith

<%= javascript_include_tag "application" %>

资产管道上的Rails 指南非常有帮助。不过,在这里提供一些解释......

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

默认情况下,Rails只会编译application.js,application.css和. 这意味着,除非您为文件添加指令,否则Rails 将忽略它。.js/.cssapp/assetslib/assetsvendor/assets//= requirepages.jsapplication.js

这就是为什么您尝试添加pages.js到文件列表以使用config.assets.precompile. 这告诉 Rails 显式编译该文件,使其可以通过 javascript include 像

<%= javascript_include_tag "pages" %>

我假设您没有将其放入您的 HTML 中。由于几个原因,您通常不会选择这条路线,其中一个原因是您这样做是在对 Rails 试图为您提供资产管道//= require线的帮助说“不,谢谢”。

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

于 2012-08-31T19:02:39.487 回答