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

时间:2012-04-12 20:22:28

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

在我的资产中,我有一个名为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

     

显示第{1行引发的…/app/views/maps/show.html.erb

     

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

  • 为什么@map文件中没有js.erb
  • 我还能如何访问控制器中定义的实例变量?

3 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分:1)

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

但是,您可以在HTML页面中使用javascript。可以使用&lt;%= @ map.title%&gt;提供的常量值生成javascript。

将javascript放在部分内容中,然后将其呈现在页面中的标记中。

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

答案 2 :(得分:0)

不要忘记使用escape_javascript()