2012-02-19 24 views
0

私は、ユーザーは、彼らが受け取ったことのコードを有効にすることができ、プロセスを持っている:アクティベーションプロセスは、次の操作を行う必要があります。Railsでクレジットアクティベーションコードを正しく処理する方法は?

  1. 作成したユーザーアカウント(User.credits)
  2. にXクレジットを追加新しいクレジットログ項目(履歴の目的のみ)
  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が最も可能性があります)

金額を追加してコードをマークすることが確実に行われるように、これをトランザクションに入れたいとします。

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 

は、あなたがこのようなActivateメソッドを定義し、あなたのCreditCodeに想定します

関連する問題