2012-02-29 11 views
1

私は必要なことをすることができる場所がいくつかありますが、どこがベストプラクティスに沿っているのかわかりません。Railsのベストプラクティス - このコードはどこにありますか?

オーダーコントローラがあり、オーダーが正常に作成された後、サブスクリプション(オーダーが成功した場合のみ)と参照(オーダーが関連付けられている場合のみ)を作成します。

ここで明白な選択肢は、Orderモデルでafter_createを使用することですが...どのようにしてセッションデータを取得できますか? (照会ID、フレンドID、バウチャーIDは、Order dbに格納する必要がないため、セッション内にのみ存在します)。

作成アクションで購読および紹介オブジェクトを作成するだけです(私が月にどのように持っていますか)、より良い方法がありますか?私は誰を期待していないので、私は本当にこれを適切に行うしたいと思います - (支払いが成功した場合@ order.purchaseのみtrueを返す)

def create 
if @order.save 
    if @order.purchase 
     Subscription.create(:order_id => @order.id, :product_id => @order.product_id) 
     if @order.voucher 
     Referral.create(:user_id => session[:friend_id], :order_id => @order.id, 
         :voucher_amount => @voucher_value) 
     end 
     render :action => "success" 
    else 
     render :action => "failure" 
    end 
    else 
    render :action => 'new' 
    end 
end 

任意の助けをいただければ幸いです :

は、ここに私のアクションを作成しますたぶん簡単な質問であるかと尋ねています。コールバックの

答えて

0

私は最近同様の質問をしました。見てください、私はコールバックの単純な仮想属性もあなたのためにそれを行うと思います。

Fetch current user in after_create filter

+0

こんにちは、ありがとう - 仮想属性は、それについて行く興味深い方法のように見えます。このように使用することには、何らかの弱点がありますか? – eBrooker

+0

私は本当に何も持っていません。非常に自然で、コールバックを使用することもできます。 – Spyros

+0

申し訳ありません私は十分なポイントや何かを持っていないので私はあなたの答えをアップアップすることはできません。とにかく私はあなたの提案の組み合わせを行って、すべてをモデルに移し、仮想属性を使用してパラメータを取得しました。残念ながら、コールバックメソッドを使用することはできませんでした。新しいオブジェクトを作成するための属性の1つは、update_attributeが実行された後にのみアクセス可能で、Orderが作成されるまで呼び出されません(最初の投稿の.purchaseメソッドの一部です) 。お返事ありがとうございました! – eBrooker

0

使用は、あなたの人生は簡単だろう、あなたは次モデルのafter_saveコールバックですべてのものを行う

after_save使用する必要があります。セッション変数がモデルで利用できない場合、あなたはまた、すべての

class Order < ActiveRecord::Base 
    def post_save require_attr 

    #create subscriptions 

    # create referral 

    end 
end 
よう

のようなのparamsを必要と受け入れるすべてのロジックに対処するためのpost_saveメソッドを持つことができます。コールバックhere

編集用レールのAPIドキュメントを参照してください

+0

私が達成しようとしているものを見てください - どのように私はコールバックで使用するための私のモデルにセッションデータ(および他の変数)を入手できますか? – eBrooker

+0

大丈夫、それを見ていない。この場合は、作成後のすべての投稿を処理するモデルメソッドを持つことができ、パラメータを渡すことができます。 基本的に、すべてのビジネスロジックをモデル化して、コントローラに入れる必要があります。 –

+0

ああ、ありがとう笑、私は今コールバックを使用していない、ちょうど私のモデルの正常な方法は右ですか? (または、コールバックで使用するためにモデルにパラメータを取得する方法についていくつかの方法がありませんか?)ご協力いただきありがとうございます! – eBrooker

関連する問題