【问题标题】:NoMethodError thrown when trying to use controller variables in js.erb file尝试在 js.erb 文件中使用控制器变量时抛出 NoMethodError
【发布时间】:2012-04-12 20:22:27
【问题描述】:

在我的资产中,我有一个名为maps.js.erb 的文件,基本上只有以下(调试)内容:

alert("<%= @map.width %>");

这个 JS 文件是通过属于 maps 的 show.html.erb 视图加载的。

<%= javascript_include_tag params[:controller] %>
<h1><%= @map.title %></h1>
…

HTML 文件本身会显示地图的标题,例如当浏览到/maps/1/ 时,因为@map 是在控制器中定义的。但是,只要我包含 JS 文件,就会收到以下错误:

地图中的 NoMethodError#show

显示…/app/views/maps/show.html.erb 第 1 行出现的位置:

nil:NilClass 的未定义方法“标题” (在…/app/assets/javascripts/maps.js.erb

  • 为什么@mapjs.erb 文件中不可用?
  • 我还能如何访问控制器中定义的这个实例变量?

【问题讨论】:

  • 你宁愿用alert("&lt;%= @map.width %&gt;"); 调试
  • 你是对的,但在这个问题的上下文中并不重要。

标签: javascript ruby-on-rails asset-pipeline ruby-on-rails-3.2


【解决方案1】:

Ryan Bates 就该主题做了一个截屏视频 - 你可能想看看:

http://railscasts.com/episodes/324-passing-data-to-javascript


html.erb文件中,可以定义变量:

<%= javascript_tag do %>
  window.productsURL = "<%=j products_url %>";
  window.products = <%=raw Product.limit(10).to_json %>;
<% end %>

【讨论】:

  • @slhck:感谢您更新我的问题。不过,我不认为这是要走的路,因为您从 unobtrusive JavaScript 更改为 inline JavaScript,我认为这不是最佳实践。您可能想在某个时候在与我的聊天中讨论这个问题。
  • 我真的只需要传递一些变量,所以这对我来说是一个可以接受的解决方案。你有更好的想法,不需要太多开销吗?
  • @slhck:我会考虑再告诉你
【解决方案2】:

您不能在通用 js 文件中评估 @map.title,因为该文件在稍后调用控制器之前生成和提供一次,然后被缓存。

但是,您可以在 HTML 页面中使用 javascript。可以使用 提供的常量值生成该 javascript。

将 javascript 放在部分中,并将其呈现在页面中的标记中。

我在他们的网站上看到美国银行这样做。它们在页面上的 javascript 数组中生成所有帐户交易。

【讨论】:

  • 但是如果不访问变量,为什么我什至可以在 JS 文件中使用 ERB?还有其他好的用例吗?
  • 我不能为 JS 文件的 ERB 有用。
【解决方案3】:

别忘了使用escape_javascript()

【讨论】:

  • 怎么样?在哪里?你能详细说明吗?可以举个例子吗?
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2012-11-24
相关资源
最近更新 更多