在我正在构建的小应用程序中,我有一个创建交换的控制器。当用户创建交换时,他们同时是交换的组织者和交换的参与者。参与者通过加入user_id
和exchange_id
的联接表进行跟踪。组织者由交换表中的外部user_id
键跟踪。
我正在试图找出将自动为交换组织者创建新会员记录的代码放在何处。我应该将它放在exchange_controller的创建操作本身,还是由create action触发的after_filter
中?或者也许在其他地方?问题的一部分是我找不到任何适当的after_filter使用的好例子(guides.rubyonrails.org只有稀疏的提及),所以任何指向正确方向的链接也会受到赞赏。
以下是相关的型号代码:
app/models/user.rb:
# Returns array of exchanges user is participating in
has_many :participations,
:through => :memberships,
:source => :exchange
# Returns array of exchanges user has organized
has_many :organized_exchanges,
:foreign_key => :organizer_id,
:class_name => "Exchange"
app/models/membership.rb:
class Membership < ActiveRecord::Base
attr_accessible :exchange_id, :user_id, :role
belongs_to :exchange
belongs_to :user
end
app/modles/exchange.rb:
belongs_to :organizer,
:foreign_key => :organizer_id,
:class_name => "User"
has_many :memberships, :dependent => :destroy
has_many :participants,
:through => :memberships,
:source => :user
这是相关的控制器代码:
app/controllers/exchanges_controller.rb:
def create
@exchange = Exchange.new(params[:exchange])
@exchange.organizer_id = current_user.id
if @exchange.save
redirect_to exchange_path(@exchange.id)
else
render 'new'
end
end
答案 0 :(得分:0)
after_filter
是完全不同的东西。当您的视图被完全处理并且您想要调用某些操作来执行某些操作时,会调用它。
您可以使用在数据库中创建记录时触发的after_create
回调。
在您的情况下,用户正在创建交换,因此在创建交换后,会触发after_create
回调,您可以在那里应用您的功能,以使创建交换的当前用户成为参与者。
在模型中写入的方式是这样的:
after_create :do_something
def do_something
something.do!
end
注意:在此处使用after_save
并不好,因为每次保存记录时都会触发它,或者即使您更新记录也会触发它。
有一个很好的SO帖子清楚地告诉你after_create
和after_save
之间的区别。
请参阅this SO帖子了解两者之间的差异。
有关回调的更多信息是here。