Вопрос: вложенная форма & 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 остаются постоянными, за исключением группы пользователей.

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


4


источник


Ответы:


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

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


4



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

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

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

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


0



Расширение ответа @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