0

在我正在构建的一个小应用程序中,我有一个创建交换的控制器。当用户创建交换时,他们同时是交换的组织者和交换的参与者。user_id参与者由连接 a和 an的连接表跟踪exchange_iduser_id组织者由交换表中的外键跟踪。

我试图找出将自动为交易所组织者创建新会员记录的代码放在哪里。我应该把它放在exchange_controller 的创建动作本身中,还是放在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
4

1 回答 1

0

after_filter在这种情况下是完全不同的事情。当你的视图被完全处理并且你想要调用一些动作来做某事时,它会被调用。

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

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

在模型中的写法是这样的:

  after_create :do_something

  def do_something
    something.do!
  end

注意:这里不好用after_save,因为每次保存记录或者更新记录时都会触发。

有一篇不错的 SO 帖子清楚地告诉您 和 之间的after_create区别after_save

有关两者之间的区别,请参阅此SO 帖子。

更多关于回调的信息在这里

于 2013-02-27T09:02:15.893 回答