Как правильно обрабатывать коды активации кредита в Rails? - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть процесс, при котором пользователь может активировать полученный код: процесс активации должен выполнить следующее:

  1. Добавить X кредитов в учетную запись пользователя (User.credits)
  2. Создание нового элемента кредитного журнала (только для целей истории)
  3. Отметьте код как активированный, чтобы пользователь не мог активировать его снова.

У меня естьконкретный контроллер для этой задачи.Я создал метод "code_activate", который работает.Но я считаю, что он не совместим с кислотой.Должен ли это быть метод в некоторой модели (пользователь?) Или в контроллере, как я это сделал?Как бы вы реализовали это «правильным способом»?

Вот код:

  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(/@AMOUNT@/, code.amount.to_s)) }, :status => :ok
  end

1 Ответ

2 голосов
/ 19 февраля 2012

Это бизнес логика. Он относится к модели (скорее всего, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...