0

我正在开发一个 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

任何关于如何改进我的代码的提示或反馈将不胜感激。

4

1 回答 1

0

在我看来,当你写 JS 时,除非绝对必要,否则你不应该使用 inline ruby​​。大多数情况下,这是糟糕设计的标志,并且会生成与服务器端逻辑紧密耦合的代码。

最好将您需要的数据存储在您的标签属性中——或者使用那些已经存在的数据。

在你的情况下,你可以这样做:

<% @matches.each do |match| %>
   <%= check_box_tag :my_button_group, false, value: match.id %>
<% end %>

(顺便说一句,当您允许多项选择时,您不应该使用单选按钮 - 使用复选框)

如果您确实需要添加更多数据,可以通过将其添加到选项中以 html5 方式完成:

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") };
            });
于 2013-01-25T21:04:41.013 回答