вложенная форма & habtm - PullRequest
4 голосов
/ 12 июня 2010

Я пытаюсь сохранить в таблице соединений отношения 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 ]

4 голосов
/ 24 ноября 2010

Вместо использования 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

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

0 голосов
/ 07 февраля 2013

Расширение ответа @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
0 голосов
/ 06 ноября 2010

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

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

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

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

...