【问题标题】:Rails/Javascript: Uncaught ReferenceError when passing instance variable to CoffeescriptRails / Javascript:将实例变量传递给Coffeescript时未捕获ReferenceError
【发布时间】:2012-08-02 00:24:22
【问题描述】:

我有一个控制器#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 中处理这个问题的最佳方法是什么?

【问题讨论】:

标签: javascript ruby-on-rails instance-variables


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    attach them as properties on window
    
    <%= javascript_tag do %>
      window.min_rating = <%= @min_rating %>
    <% end %>
    

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

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 2014-10-15
      • 2014-10-31
      相关资源
      最近更新 更多