2013-04-09 213 views
10

我有一個MyModel的模型MyModel與序列化屬性a,描述符號數組。顯示一個複選框列表而不是多個選擇

此代碼:

<% form_for @my_model do |f| %> 
    <%= f.select :a, MyModel::AS, :multiple => true) %> 
<% end %> 

的參數是正確的:

{ :my_model => { :a => [:a_value1, :a_value2] } } 

我想要改造這個多選擇到一組複選框,這樣的:

<% form_for @my_model do |f| %> 
    <% MyModel::AS.each do |a_value| 
    <%= f.check_box(:a_value) %> 
    <% end %> 
<% end %> 

它也可以工作,但參數並不相同:

{ :my_model => { :a_value1 => 1, :a_value2 => 1 } } 

我認爲2個解決方案,以返回到第一個解決方案...

  • 改變我check_box到,取代多個選擇,並添加一些JavaScript來「檢查」選擇值,當用戶對CLIC check_box_tags。然後,參數將直接在控制器中相同。
  • 在控制器中添加一個litte代碼來「調整」我的參數。

什麼解決方案是不那麼醜陋?或者還有其他的嗎?

回答

28

我找到了一個解決方案,使用'多個'選項,我不知道。

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box(:a, { :multiple => true }, a_value) %> 
<% end %> 

結果參數有點奇怪,但它應該工作。從@Viren

{"my_model" => { "a" => ["0", "a_value1", "0", "a_value2", "0"] } 

編輯:在功能的端部通過nil

<%= f.check_box(:a, { :multiple => true }, a_value, nil) %> 

完美。

+7

在末端傳遞'nil',它會按預期工作檢查[this](http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box) – Viren 2013-04-11 06:23:14

+0

@Viren感謝提示。 – pierallard 2013-04-15 06:57:11

+1

如果你願意,請編輯你的答案,那裏也有一個錯字。在<%MyModel :: AS.each之後| a_value |'需要'%>'之後。只是說 – ksugiarto 2013-06-22 09:41:23

3

你可以這樣說:

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box("a[]", a_value) %> 
<% end %> 

這將使PARAMS前來服務器如下

{ :my_model => { :a => [:a_value1, :a_value2] } } 
3

還有另一種解決方案值得一提的是,使得它很容易插入記錄數據庫,如果您有has_and_belongs_to_manyhas_manythrough關係,請使用collection_check_boxes表單助手。

<%= f.collection_check_boxes :mymodel_ids, MyModel::AS, :id, :name do |m| %> 
    <%= m.check_box %> <%= m.label %> 
<% end %> 

然後,在控制器中,我們將允許mymodel_ids屬性:

params.require(:mymodel).permit(:name, mymodel_ids:[]) 

我們也可以建立一個模型驗證,以要求該複選框中的至少一個檢查:

validates :mymodel_ids, presence: true 

此方法的一個附加好處是,如果您稍後編輯mymodel記錄並取消選中其中一個複選框,其記錄將從中刪除關聯表save

相關問題