2013-01-25 52 views
0

我正在開發一個Rails應用程序,並且我想創建一個動態數量的變量以通過AJAX請求傳遞給我的控制器。也就是說,如果只有3個對象,我想創建3個變量,如果有5個對象,則要創建5個變量。通過AJAX調用將動態變量傳遞給Rails控制器

在我的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 

有關如何改進我的代碼的任何提示或反饋將不勝感激。

+0

你爲什麼要使用內聯紅寶石,然後AJAX?似乎矛盾... – elclanrs

+0

我認爲你提出的解決方案動態創建數據是好的。 –

+0

@elclanrs對於webdev還是比較新的,所以我不瞭解很多細微之處。這通常不是解決問題的方法嗎?此代碼的視圖是新方法,我對create方法進行AJAX調用以傳入數據並創建對象。 – Huy

回答

0

在我看來,當你寫JS時,除非絕對必要,否則不應該使用內聯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") }; 
      }); 
相關問題