尝试在 js.erb 文件中使用控制器变量时抛出 NoMethod错误

NoMethodError thrown when trying to use controller variables in js.erb file

本文关键字:变量 控制器 错误 NoMethod js erb 文件      更新时间:2023-09-26

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

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

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

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

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

地图中的NoMethod错误#show

显示 #1 行升高…/app/views/maps/show.html.erb

nil:NilClass 的未定义方法 'title' (…/app/assets/javascripts/maps.js.erb

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

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 %>

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

但是,您可以在HTML页面中使用javascript。 该 JavaScript 可以使用 <%= @map.title %> 提供的常量值生成。

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

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

不要忘记使用 escape_javascript() .