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


});

但我得到了 NoMethodError ......我做错了什么?@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">

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

4

1 回答 1

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 的动作控制器中分配实例变量,但缺点是加载时间较长。

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

于 2012-05-26T23:04:51.917 回答