我正在开发一个rails应用程序,我想创建一个动态数量的变量,通过AJAX请求传递给我的控制器。也就是说,如果只有3个对象,我想创建3个变量,如果有5个对象,我想创建5个变量。
在我的javascript文件中,我已经设法创建了一个动态数量的变量。
var count = parseInt("#{@matches.count}");
while(count>0){
eval("result_" + count + "= $('input:radio[name=result_" + count + "]:checked').val()");
count -= 1;
}
这会创建result_1
,result_2
,result_3
等
到目前为止我的AJAX请求是静态的,因为它总是必须有5个结果。我希望这是动态的。
$.ajax({
type: 'GET',
url: '/mt_results/create',
dataType: 'json',
data: {
'result_1' : { matched_id: "#{@matches.first.id}", result: result_1 },
'result_2' : { matched_id: "#{@matches.second.id}", result: result_2 },
'result_3' : { matched_id: "#{@matches.third.id}", result: result_3 },
'result_4' : { matched_id: "#{@matches.fourth.id}", result: result_4 },
'result_5' : { matched_id: "#{@matches.fifth.id}", result: result_5 }
},
success: function(e){
console.log("AWWWWWWW YEAH!!");
}
});
最好的方法是动态创建JSON对象(类似于我创建results_#
的方式)并将其分配给变量(让我们称之为data_var
)。然后,我可以像下面那样传递data_var:
data: data_var
我将非常感谢有关如何改进代码的任何提示或反馈。
答案 0 :(得分:0)
在我看来,当你编写JS时,除非绝对必要,否则不应使用内联ruby。大多数情况下,这是设计糟糕的标志,并产生与服务器端逻辑紧密耦合的代码。
最好将您需要的数据存储在标记属性中 - 或者使用已存在的数据。
在你的情况下,你可以这样做:
<% @matches.each do |match| %>
<%= check_box_tag :my_button_group, false, value: match.id %>
<% end %>
(顺便说一下,当你允许多种选择时,你不应该使用单选按钮 - 使用复选框)
如果你真的需要添加更多数据,你可以通过将hki5添加到选项中来实现:
data: {custom-value: "foo", another-one: "bar"},
会将这些属性添加到标记中:
<input ... data-custom-value="foo" data-another-one="bar" />
现在 - 您想分析这些框并向任何地方发送ajax请求。为什么甚至打扰分析? Rails为您提供了一种处理远程表单的简单方法。只需将你的盒子包装成一个遥远的形式,点击就可以提交它,然后就可以了 - 它甚至可以优雅地降级!
如果您有更难以执行的事情(使用数据属性......),请始终自己制作ajax调用数据:
var boxes = $("input:checkbox[name=my_button_group]:checked");
var data = boxes.map(function(box, index){
return { matched_id: box.val(), result: box.attr("data-custom") };
});