Вложенная форма & 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