2010-03-02 39 views
13

如何在rails中使用check_box_tag助手時設置自定義ID?在Rails中使用check_box_tag的自定義ID

我有一個循環創造了一堆基於集合的複選框:

- subject.syllabus_references.each do |sr| 
     = check_box_tag 'question[syllabus_reference]', sr.id, :id => sr.id 
     = label_tag sr.id, sr.name 

我想設置一個自定義的ID,這樣我的複選框標籤工作正常,但我似乎無法到弄清楚如何(:id => sr.id不起作用...)。

的問題也可能與我定義標籤的方式,所以如果我可以得到以引用正確的複選框不設置自定義ID,那麼這將是罰款也...

+0

你應該回來,並接受這個問題的答案:3 – Kevin

回答

16

我用這個在我的應用程序從集合創建複選框的標籤,並將其提交的數組:

<% @cursos.each do |c| %> 
    <span class='select_curso'> 
    <%= check_box_tag "vaga[curso_ids][]", 
     c.id, (checked = true if form.object.curso_ids.include?(c.id)) %> 
    <%= label_tag "vaga[curso_ids][][#{c.id}]", c.nome %> 
    </span> 
<% end %> 

所以在PARAMS,我有一個數組「curso_ids」 => [「1」,「 3「,」5「]而不是字符串」curso_ids「=>」5「。如果要返回單個值,請使用vaga [curso_id],否則使用vaga [curso_ids] []返回數組。

+1

你剛纔幫助我清理一些難看的代碼。謝謝! – crftr

+0

一個小問題:你可以從第四行刪除「true if」這個詞,因爲無論如何,它們後面的表達式的值都是「true」或「false」。 –

3

思考我想通了......

- subject.syllabus_references.each do |sr| 
    = check_box_tag "question[syllabus_reference][#{sr.id}]", sr.id 
    = label_tag "question[syllabus_reference][#{sr.id}]", sr.name 

這樣的作品,但如果你有更好的方式讓我知道!

11

@Ganesh,在您的解決方案所產生的PARAMS哈希有以下形式:

params[:question][:syllabus_reference] = {1 => 1, 2 => 2, 3 => 3, ...} 

這些應該更好地爲您:

check_box_tag "question[syllabus_reference][]", sr.id, checked, {:id => "question_syllabus_reference_#{sr.id}" 

注意第三個參數(檢查)所需的這工作。由此產生的參數陣列將是

params[:question][:syllabus_reference] = {1, 2, 3, ...} 
+0

確實看起來更好,謝謝! –

1

這是非常有用的,並帶來了我的爲期一天的搜索結束。我到目前爲止發現的大部分內容都包含語法和額外的參數,這些參數可以完全標記或忽略。我想要做的就是將數組從我的視圖傳遞到控制器,並使用複選框告訴控制器要處理的數組元素。我能夠進一步減少上述情況,以:

<%= check_box_tag "c[]", c.id %> 

其中c來自我的數據庫:

<%= @objects.each do |c| %> 

這當然通過對象ID的陣列,以我的控制器僅與該檢查條目(條目默認未選中,因爲我省略了:假參數,該參數順便產生與相同的結果:真),這就是我所需要的差不多

現在我只需要傳入一個對象類型指示符 - 即使只是一個文字字符串也可以很好地執行 - 以便控制器知道要處理的對象類型,而不必使用額外的列來擴充我的模型。我將立即着手併發布我的解決方案,但請告訴我,如果您已經知道,是否有快速簡單的方法來執行此操作。

0

Leito,

就關閉循環,我放棄了試圖通過check_box_tag通過在對象類型指標。我添加到上面最後一篇文章中顯示的語法中的每個參數(如下所示)只是導致複選框狀態默認爲選中而不是未選中,而不會將任何其他數據傳遞到控制器。

雖然他們目前仍然警惕替代解決方案,但我暫時將對象類型納入submit_tag值。這將功能與顯示相關聯,因爲值是用戶在提交按鈕上顯示的值,但可以認爲這會強化視圖的清晰度,即使它向控制器提供了所需的消歧。

學習天天...

14

如果你給的複選框一個額外的參數,將工作:

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id 
+1

爲我工作,它是什麼魔術? –

+1

@arivarasan函數定義是'check_box_tag(name,value =「1」,checked = false,options = {})',所以'nil'是'checked'參數的佔位符;根據您的喜好,「true」或「false」也可以工作。 – vol7ron