0

我有一个控制器#action,它定义了一个实例变量:

@min_rating = 4

在视图中,我有以下内容:

<%= javascript_tag do %>
  min_rating = <%= @min_rating %>
<% end %>

然后在我的 Coffeescript 中,我可以执行以下操作:

jQuery ->
  alert min_rating

如果我在该视图的页面上,它可以正常工作。

但是,如果我在另一个视图中,我会收到一个 JS 错误,指出未定义 var min_rating:

Uncaught ReferenceError: min_rating is not defined 

这是因为我为 application.js 中的所有视图加载了所有 JS:

//= require_tree .

所以,我的问题是:在 Rails 中处理这个问题的最佳方法是什么?

4

2 回答 2

1

由于咖啡脚本没有 var 语句,它会自动将它插入到咖啡脚本中的所有变量中,这样就可以防止编译后的 JavaScript 版本将所有内容泄漏到全局命名空间中。

因此,由于没有办法故意从咖啡脚本方面“泄漏”到全局命名空间中,因此您需要将全局变量定义为全局对象的属性。

attach them as properties on window

<%= javascript_tag do %>
  window.min_rating = <%= @min_rating %>
<% end %>

然后在您的咖啡脚本中访问 min_rating。

于 2012-08-10T06:34:39.543 回答
0

这取决于你的目标。一个简单的选择是在引用之前检查 min_rating 是否在 javascript 中定义:

jQuery ->
  if typeof min_rating != 'undefined'
    alert min_rating

或者,您可以确保在每个页面上都定义了 min_rating - 可能通过将 javascript_tag 调用移动到装饰器并回退到默认值。这对您的应用程序是否有意义取决于您。

或者您可以尝试避免在不需要的页面上加载在 min_rating 上引用的脚本。但这意味着您将无法在每个页面上使用相同的组合 javascript 文件。

于 2012-08-03T23:20:59.863 回答