Подтвердить что ты не робот

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
4b9b3361

Ответ 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, и должно быть два поля:

  • role_id
  • user_id