【问题标题】:Proper Usage of Rails After_FilterRails After_Filter 的正确使用
【发布时间】:2013-02-27 08:50:50
【问题描述】:

在我正在构建的一个小应用程序中,我有一个创建交换的控制器。当用户创建交换时,他们同时是交换的组织者和交换的参与者。参与者由连接user_idexchange_id 的连接表跟踪。组织者由交换表中的外部user_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

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2011-06-21
      • 1970-01-01
      • 2017-02-17
      相关资源
      最近更新 更多