2012-02-19 31 views
0

我有一个过程,其中用户可以激活,他们已经收到了代码:激活过程中应做到以下几点:如何在Rails中正确处理信用激活码?

  1. 添加X信用的用户帐户(User.credits)
  2. 创建新的信用记录项目(仅用于历史记录)
  3. 将代码标记为已激活,以便用户不能再次激活它。

我对此任务有特定的控制器。我创建了一个方法“code_activate”,这是有效的。但我相信这不符合ACID标准。这应该是一种模式(用户?)还是控制器中的方法?你如何以“正确的方式”实施它?

下面的代码:

def code_activate 
    code = CreditCodes.find_by_code(params[:code]) 
    unless code 
     render :json => { :success=>false, :message=>(t :codedoesnotexist)} 
     return 
    end 

    if code.activated 
     render :json => { :success=>false, :message=>(t :codealreadyactivated)} 
     return 
    end 

    # Add credits to user 
    current_user.credits += code.amount 
    current_user.save 

    # Save credit log record 
    cl = current_user.creditlog.new 
    cl.actionid = 1 
    cl.amount = code.amount 
    cl.save 

    # Set code as activated 
    code.activated = true 
    code.save 

    # Show success message 
    render :json => { :success=>true, :message=>((t :creditsadded).gsub(/@[email protected]/, code.amount.to_s)) }, :status => :ok 
    end 

回答

2

它的业务逻辑。它属于模型(最有可能的是CreditCode)

你想把它放在一个事务中,以确保添加金额和标记代码发生全部或全部没有。

假设你CreditCode您定义的激活方法是这样的:

def activate(user) 
    transaction do 
    # Add credits to user 
    user.credits += code.amount 
    user.save 

    # Save credit log record 
    cl = user.creditlog.new 
    cl.actionid = 1 
    cl.amount = amount 
    cl.save 

    # Set code as activated 
    activated = true 
    save 
    end 
end