Rails 4 - has_and_belongs_to_many关联的复选框

Coe*_*ulf 19 ruby-on-rails ruby-on-rails-4

我最近在Rails 4中获取has_and_belongs_to_many(HABTM)关联的复选框时遇到了问题.我能够在几个不同的地方找到有关如何使其正常工作的信息,但认为记录少数几个是好的在StackOverflow上的一个地方使它正常工作所需的简单步骤.

作为一个设置假设一个Kennel模型与HADTM关联到Handler.

class Kennel
    has_and_belongs_to_many :handlers
end
Run Code Online (Sandbox Code Playgroud)

JP *_*ffy 36

这就是表单所需要做的全部内容:当有内置帮助程序时,不要手动执行此操作.

<%= form_for @kennel do |f| %>
  <%= f.collection_check_boxes(:handler_ids, Handler.all, :id, :to_s) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • 如果使用强params,请务必添加它(如其他答案中所示)`params.require(:kennel).permit({handler_ids:[]})` (7认同)
  • http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_check_boxes (2认同)

Coe*_*ulf 15

表单应该是这样的:

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

hidden_​​field_tag允许用户取消选中所有框并成功删除所有关联.

控制器需要通过allowed_pa​​rams方法中的强参数允许参数:

params.permit(kennel: [:city, :state
    {handler_ids: []},
    :description, ...
    ])
Run Code Online (Sandbox Code Playgroud)

参考文献:


A H*_*H K 8

我这样实现has_and_belongs_to_many 关联:

模型/角色

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)

模型/用户

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end
Run Code Online (Sandbox Code Playgroud)

用户/ _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>
Run Code Online (Sandbox Code Playgroud)

users_controller.rb

def user_params
    params.require(:user).permit(:name, :email, { role_ids:[] })
  end
Run Code Online (Sandbox Code Playgroud)

中间table_name应该是roles_users,应该有两个字段:

  1. ROLE_ID
  2. 用户身份