正确使用Rails After_Filter

时间:2013-02-27 08:50:50

标签: ruby-on-rails ruby-on-rails-3 controllers

在我正在构建的小应用程序中,我有一个创建交换的控制器。当用户创建交换时,他们同时是交换的组织者和交换的参与者。参与者通过加入user_idexchange_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

1 个答案:

答案 0 :(得分:0)

在这种情况下,

after_filter是完全不同的东西。当您的视图被完全处理并且您想要调用某些操作来执行某些操作时,会调用它。

您可以使用在数据库中创建记录时触发的after_create回调。

在您的情况下,用户正在创建交换,因此在创建交换后,会触发after_create回调,您可以在那里应用您的功能,以使创建交换的当前用户成为参与者。

在模型中写入的方式是这样的:

  after_create :do_something

  def do_something
    something.do!
  end

注意:在此处使用after_save并不好,因为每次保存记录时都会触发它,或者即使您更新记录也会触发它。

有一个很好的SO帖子清楚地告诉你after_createafter_save之间的区别。

请参阅this SO帖子了解两者之间的差异。

有关回调的更多信息是here