2014-02-10 4 views
13

У меня недавно возникла проблема с получением флажков для работы с ассоциацией has_and_belongs_to_many (HABTM) в Rails 4. Мне удалось найти информацию о том, как заставить ее работать корректно в нескольких разрозненных местах, но подумал, что было бы неплохо документировать несколько простых шагов, необходимых для правильной работы в одном месте здесь, в 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_params:

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

Список литературы:

+0

'check_box_tag' отсутствует закрывающая скобка – LukasMac

+0

Спасибо @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 

Intermediate table_name должно быть roles_users и там должно быть два поля:

  1. ROLE_ID
  2. user_id
+1

спасибо @A H K, имя таблицы сложно. –

+1

Название таблицы было сложной частью, потому что мои ребята проверяют ее роль не ролей. – imsinu9

33

Это все, что вам нужно сделать для формы: не делайте это вручную, когда есть встроенный помощник.

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

Вы уверены, что это не использует жемчужину simple_form? вот что мне кажется. @jpduffy – inthenameofmusik

+2

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

+4

Если вы используете сильные параметры, обязательно добавьте его (как видно из других ответов) 'params.require (: kennel) .permit ({handler_ids: []})' –

Смежные вопросы