Получить созданный объект из 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
и это должно работать автоматически.