.js.erb中的NoMethodError

时间:2012-05-26 22:22:09

标签: javascript ruby ruby-on-rails-3.1

我正在尝试编写不引人注目的JavaScript,我认为:

<%= javascript_include_tag "trend" %>

在我的trend.js.erb中有:

$(document).ready(function() {

    <% @testsss.each do |t|%>

        $('#<%= "t-"+t.id.to_s %>').click(function(event){
            //alert("sometext");
            $.ajax({type: "GET", url: "/returngraph?test=<%= t.id.to_s %>", dataType: "html",success: 
            function(data){ $("#chart").html(data)} });

        }); 

    <% end %>


});

但我得到NoM​​ethodError ...... 我做错了什么? @testsss是一组对象,同样@ testsss.each在trend.html.erb中工作,我在这里调用javascript_include_tag“trend”

谢谢

编辑:

这是实际错误:

NoMethodError in Statisticall#trend

Showing /xxxx/app/views/statisticall/trend.html.erb where line #1 raised:

undefined method `each' for nil:NilClass
  (in /xxxx/app/assets/javascripts/trend.js.erb)
Extracted source (around line #1):

1: <%= javascript_include_tag "trend" %>
2: <div id="hhead">

我有控制器统计和行动趋势

1 个答案:

答案 0 :(得分:2)

我猜@testsss是在控制器中定义的。

资产管道未被动作控制器编译或触及,因此......您不能在管道中的控制器中分配实例变量。

解决方法包括@ testsss.to_json,并将其作为视图中的JS变量包含在内

类似

#app/views/some/view.html.erb
<script type='text/javascript'>
 window.testsss = <%= @testsss.tojson %>
</script>

然后在你的javascript中使用underscore.js做这样的事情

  _(testsss).each(function(t){
    $('#t-'+ t.id).click(function(event){
         //alert("sometext");
         $.ajax({type: "GET", url: "/returngraph?test=" + t.id, dataType: "html",success: 
         function(data){ $("#chart").html(data)} });
     }); 
  });

或者您可以在视图内而不是资产管道中呈现该js

#app/views/some/view.html.erb
<script type='text/javascript'>
  $(document).ready(function() {
    <% @testsss.each do |t|%>
      $('#<%= "t-"+t.id.to_s %>').click(function(event){
        $.ajax({
          type: "GET",
          url: "/returngraph?test=<%= t.id.to_s %>",
          dataType: "html",
          success: function(data){ $("#chart").html(data)}
        });
      }); 
    <% end %>
  });
</script>

这样做可以让您在js中的动作控制器中分配实例变量,但缺点是主页加载时间较长。

我更喜欢第一种方法,但这取决于你?