通过AJAX调用将动态变量传递给Rails控制器

时间:2013-01-25 02:17:00

标签: javascript ruby-on-rails ajax ruby-on-rails-3 jquery

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

我将非常感谢有关如何改进代码的任何提示或反馈。

1 个答案:

答案 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") };
            });