Rails 4 - флажки для ассоциации has_and_belongs_to_many
У меня недавно возникла проблема с получением флажков для работы в ассоциации has_and_belongs_to_many (HABTM) в Rails 4. Мне удалось найти информацию о том, как заставить ее работать правильно в нескольких разных местах, но подумал, что было бы хорошо запишите несколько простых шагов, необходимых для правильной работы в одном месте здесь, в StackOverflow.
В качестве установки возьмем модель питомника с ассоциацией HABTM с Handler.
class Kennel
has_and_belongs_to_many :handlers
end
Ответы
Ответ 1
Форма должна иметь что-то вроде этого:
<%= 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 позволяет пользователю снять все флажки и успешно удалить все ассоциации.
Контроллер должен разрешить параметр через сильные параметры в методе allow_params:
params.permit(kennel: [:city, :state
{handler_ids: []},
:description, ...
])
Ссылки
Ответ 2
Это все, что вам нужно сделать для формы: не делайте это вручную, когда есть встроенный помощник.
<%= form_for @kennel do |f| %>
<%= f.collection_check_boxes(:handler_ids, Handler.all, :id, :to_s) %>
<% end %>
Ответ 3
Я реализую ассоциацию 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
Промежуточное имя_таблицы должно быть role_users, и должно быть два поля: