2014-02-10 63 views
13

我最近有一個問題,讓複選框在Rails 4中爲has_and_belongs_to_many(HABTM)關聯工作。我能夠找到有關如何在一些不同的地方正常工作的信息,但認爲這將是很好的文件的幾個簡單的步驟,使其在StackOverflow上的一個地方正確工作。Rails 4 - has_and_belongs_to_many協會的複選框

作爲一個設置假定與HABTM協會處理程序的狗舍模型。

class Kennel 
    has_and_belongs_to_many :handlers 
end 

回答

14

的形式應該是這樣的:

<%= form_for(@kennel) do |form| %> 
    ... 
    <div class="field"> 
     <div class="field_head">Handlers</div> 
     <%= hidden_field_tag("kennel[handler_ids][]", nil) %> 
     <% Handler.order(:name).each do |handler| %> 
      <label><%= check_box_tag("kennel[handler_ids][]", id, id.in?(@kennel.handlers.collect(&:id))) %> <%= handler.name %></label> 
     <% end %> 
    </div> 
    ... 
<% end %> 

的hidden_​​field_tag允許用戶取消所有的箱子和成功刪除所有關聯。

控制器需要,以允許參數通過在permitted_pa​​rams方法強參數:

params.permit(kennel: [:city, :state 
    {handler_ids: []}, 
    :description, ... 
    ]) 

參考

+0

'check_box_tag'缺少右括號 – LukasMac

+0

Thanks @LukasMac。固定。 – Coenwulf

7

我實現has_and_belongs_to_many協會這樣:

模型/角色

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

模型/用戶

class User < ActiveRecord::Base 
    has_and_belongs_to_many :roles 
end 

用戶/ _form.html.erb

--- 
---- 
----- 
<div class="field"> 
     <% for role in Role.all %> 
      <div> 
       <%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %> 
       <%= role.name %> 
      </div> 
     <% end %> 
    </div> 

users_controller.rb

def user_params 
    params.require(:user).permit(:name, :email, { role_ids:[] }) 
    end 

中間體表名應該是roles_users並且應該有兩個字段:

  1. ROLE_ID
  2. user_id說明
+1

謝謝@A H K,表名很棘手。 – 2014-12-07 12:58:50

+1

表名是一個棘手的部分,因爲我的傢伙檢查它的角色不是角色。 – imsinu9

33

這是您需要爲表單完成的所有操作:不要在有內置幫助器時手動執行此操作。

<%= form_for @kennel do |f| %> 
    <%= f.collection_check_boxes(:handler_ids, Handler.all, :id, :to_s) %> 
<% end %> 
+0

你確定這不是使用simple_form gem嗎?這就是我看起來的樣子。 @ jpduffy – inthenameofmusik

+2

http:// apidock。com/rails/ActionView/Helpers/FormOptionsHelper/collection_check_boxes – Nathan

+4

如果使用強參數,一定要添加它(參見其他答案)'params.require(:kennel).permit({handler_ids:[]})' –