Rails最佳实践 - 此代码应该放在哪里?

时间:2012-02-29 21:57:15

标签: ruby-on-rails-3

有几个地方我可以做我需要的事情,但我不确定哪个地方最好的地方符合良好做法。

我有一个Orders控制器,在创建成功订单后,我想创建一个订阅(但仅在订单成功时)和推荐(但仅当订单与一个订单相关联时)。

现在显而易见的选择是在Order模型上使用after_create ......但是......如何将会话数据导入到该模型中? (推荐ID,朋友ID和优惠券ID仅在会话中,因为不需要将它们存储在Order db中。)

那么我应该在创建动作中创建Subscription和Referral对象(如何在mo中创建它)还是有更好的方法?

这是我的创建动作: (@ 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

任何帮助都会受到赞赏 - 我真的很想这样做,所以我希望没有人会问我这可能是一个简单的问题。

2 个答案:

答案 0 :(得分:0)

使用回调会让你的生活变得轻松,你需要使用after_save

在订单模型的after_save回调中执行所有操作。请参阅rails api doc for callback here

编辑:如果会话变量不适用于模型,您可以使用post_save方法处理所有逻辑,这些逻辑也接受所有需要的参数,如

class Order < ActiveRecord::Base
  def post_save require_attr

   #create subscriptions

   # create referral

  end
end 

答案 1 :(得分:0)

我最近有一个类似的问题,请看一下,我认为回调中的一个简单的虚拟属性也可以为你做。

Fetch current user in after_create filter