2012-02-29 124 views
1

有幾個地方我可以做我所需要的東西,但我不確定哪裏最好的地方符合良好的做法。Rails最佳實踐 - 此代碼應該放在哪裏?

我有一個訂單控制器,創建成功的訂單後,我想創建一個訂閱(但僅當訂單成功時)以及推薦(但只有當訂單與一個訂單關聯時)。

現在明顯的選擇是在訂單模型上使用after_create ...但是...我如何獲取會話數據? (推薦ID,朋友ID和憑證ID僅在會話中,因爲不需要將它們存儲在訂單數據庫中)。

所以我應該只是在創建操作中創建訂閱和引用對象(我如何在創建操作中)或者是否有更好的方法?

這裏是我創造的動作: (@ 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 2012-02-29 23:17:00

+0

我真的沒有。這看起來很自然,也允許你使用回調。 – Spyros 2012-03-01 01:47:27

+0

對不起,因爲我沒有足夠的積分或者其他東西,我不能'回覆'你的答案。無論如何,我會結合您的建議,將所有內容都轉移到模型中,並使用虛擬屬性來獲取參數。不幸的是我不能使用回調方法,因爲創建新對象的屬性之一隻能在update_attribute發生後才能訪問,直到創建Order之後纔會調用它(這是我第一篇文章中的.purchase方法的一部分) 。謝謝你的答案! – eBrooker 2012-03-01 03:08:07

0

使用回調將使你的生活簡單,你需要使用after_save的

做你所有的東西,以模型的after_save的回調。看到鐵軌API文檔回調here

編輯:如果會話變量是不可用的模型,你可以有一個post_save方法來處理它也可以接受,都需要像

class Order < ActiveRecord::Base 
    def post_save require_attr 

    #create subscriptions 

    # create referral 

    end 
end 
PARAMS所有的邏輯
+0

請看看我試圖實現 - 我怎麼獲取會話數據(和其他變量)到我的模型與回調用? – eBrooker 2012-02-29 22:17:34

+0

好的,沒有看到。在這種情況下,你可以有一個模型方法來處理所有的後期創建/保存的東西,你可以傳遞參數給它。基本上所有的業務邏輯都應該去模型化,而不是把它放在控制器中。 – 2012-02-29 22:23:47

+0

啊,很好,謝謝大聲笑,所以我現在不使用回調,只是在我的模型正常的方法嗎? (或者我錯過了一些關於如何將參數傳入模型以用於回調的方法?)。謝謝你的幫助! – eBrooker 2012-02-29 22:40:48