Rails 4 – has_and_belongs_to_many关联的复选框

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

作为一个设置假设一个Kennel模型与Handler的HABTM关联。

class Kennel has_and_belongs_to_many :handlers end 

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

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

表单应该是这样的:

 <%= form_for(@kennel) do |form| %> ... 
Handlers
<%= hidden_field_tag("kennel[handler_ids][]", nil) %> <% Handler.order(:name).each do |handler| %> <% end %>
... <% end %>

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

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

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

参考文献

has_and_belongs_to_many这种方式实现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

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

users_controller.rb

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

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

  1. ROLE_ID
  2. 用户身份