2012-02-29 51 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