2012-02-19 3 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 
Смежные вопросы