0

私はレールアプリに取り組んでおり、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

コードを改善する方法に関するヒントやフィードバックをいただければ幸いです。

4

1 に答える 1

0

私の意見では、JSを作成するときは、どうしても必要な場合を除いて、インラインルビーを使用しないでください。ほとんどの場合、これは設計が不適切であることを示しており、サーバー側のロジックと緊密に結合されたコードを生成します。

必要なデータをタグ属性に保存するか、既存のデータを使用することをお勧めします。

あなたの場合、あなたはすることができます:

<% @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 に答える