Вложенная форма & habtm

Я пытаюсь сохранить в таблице соединений отношения habtm, но у меня проблемы.

С моей точки зрения, я передаю идентификатор группы с:

<%= link_to "Create New User", new_user_url(:group => 1) %>

# User model (user.rb)
class User < ActiveRecord::Base  
  has_and_belongs_to_many :user_groups
  accepts_nested_attributes_for :user_groups
end

# UserGroups model (user_groups.rb)
class UserGroup < ActiveRecord::Base
  has_and_belongs_to_many :users
end

# users_controller.rb
def new
  @user = User.new(:user_group_ids => params[:group])
end

в новом представлении пользователя у меня есть доступ к объекту User.user_groups, однако, когда я отправляю форму, она не только не сохраняется в моей соединительной таблице (user_groups_users), но и объекта больше нет. все другие объекты и атрибуты моего объекта User являются постоянными, за исключением группы пользователей.

я только начал изучать рельсы, так что, может быть, здесь я что-то упускаю концептуально, но я действительно боролся с этим.

3 ответа

Решение

Вместо использования accepts_nested_attributes_for, вы рассматривали просто добавление пользователя в группу в вашем контроллере? Таким образом, вам не нужно передавать user_group_id туда-сюда.

В users_controller.rb:

def create
  @user = User.new params[:user]
  @user.user_groups << UserGroup.find(group_id_you_wanted)
end

Таким образом, вы также не позволите людям лечить форму и присоединяться к какой-либо группе, которую они хотят.

Как выглядит ваш метод создания в users_controller.rb?

Если вы используете конструкцию fields_for в вашем представлении, например:

<% user_form.fields_for :user_groups do |user_groups_form| %>

Вы должны иметь возможность просто передать params[:user] (или что-то еще) в User.new(), и он будет обрабатывать вложенные атрибуты.

Расширяя ответ @jimworm:

groups_hash = params[:user].delete(:groups_attributes)
group_ids = groups_hash.values.select{|h|h["_destroy"]=="false"}.collect{|h|h["group_id"]}

Таким образом, вы извлекли хеш из хеша params и собрали только идентификаторы. Теперь вы можете сохранить пользователя отдельно, например:

@user.update_attributes(params[:user])

и добавить / удалить его групповые идентификаторы отдельно в одну строку:

# The next line will add or remove items associated with those IDs as needed
# (part of the habtm parcel)
@user.group_ids = group_ids
Другие вопросы по тегам