Получить созданный объект из InheritedResources#create

В моем приложении Rails у меня есть следующие объекты:

Group: has_many users through group_membership
GroupMembership: belongs_to user, belongs_to group
User: has_many groups through group_membership

Пользователи могут создавать группы. Когда это происходит, я хочу автоматически добавить пользователя в группу. В моем GroupsController у меня есть следующее (расширение InheritedResources):

super do |success, failure|
  if success
    GroupMembership.create(:user_id => current_user, :group_id => ???)
  ...
end

Проблема в том, что я не могу получить объект, который super создано. Есть ли способ сделать это? Или лучше, есть ли способ изменить модель LockGroup, чтобы она всегда выполняла эту связь?

2 ответа

Решение

Когда выполняется обратный вызов, у контроллера уже есть стандартная переменная экземпляра, соответствующая созданной группе: @group!!

class GroupController < InheritedResources::Base

  def create
    super do |success, failure|
      if success
        GroupMembership.create(:user_id => current_user, :group_id => @group.id)
      ...
    end
  end

end

Я предполагаю, что ключом params для вашей группы является:group. Затем вы можете использовать опцию nested_attributes_for в модели. Затем вы можете установить их в фильтре before из действия create:

class User < ActiveRecord::Base
  accept_nested_attributes_for :group_membership
end

# on your controller
before_filter :add_user, :on => [:create]

def add_user
  params[:group][:group_membership_attributes] = {}
  params[:group][:group_membership_attributes][:user] = current_user
end

или вы создаете членство в группе по инициализации пользователя:

class User < ActiveRecord::Base
  def after_initialize
    build_group_membership
  end
end


# on your controller
before_filter :add_user, :on => [:create]

def add_user
  params[:group][:user] = current_user
end

и это должно работать автоматически.

Другие вопросы по тегам