0

私が構築している小さなアプリには、交換を作成するコントローラーがあります。ユーザーがエクスチェンジを作成するとき、ユーザーは同時にエクスチェンジの主催者であり、エクスチェンジの参加者でもあります。user_id参加者は、とを結合する結合テーブルによって追跡されますexchange_id。主催者はuser_id、交換テーブルの外部キーによって追跡されます。

取引所の主催者の新しいメンバーシップレコードを自動的に作成するコードをどこに配置するかを考えています。これをexchange_controllerのcreateアクション自体に配置する必要がありますか、それともafter_filtercreateアクションによってトリガーされるように配置する必要がありますか?または多分どこか?問題の一部は、適切な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ます。

2つの違いについては、このSO投稿を参照してください。

コールバックの詳細はこちらです。

于 2013-02-27T09:02:15.893 に答える