我正在尝试编写不引人注目的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">
我有控制器统计和行动趋势
答案 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中的动作控制器中分配实例变量,但缺点是主页加载时间较长。
我更喜欢第一种方法,但这取决于你?