Как использовать метод after_create callback в rails? - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу вызвать update_balance(transaction) вместе с параметром transaction после создания действия в контроллере. «Update_balance (транзакция)» находится в модели. Код выглядит следующим образом: Контроллер транзакций:

class TransactionsController < ApplicationController
   before_action :authenticate_user!
  def new
    @transaction = Transaction.new
  end

def create
  @transaction = Transaction.new(transaction_params)
  @transaction.account = current_account
  redirect_to root_path
end

private

def transaction_params
  params.require(:transaction).permit(:amount, :transaction_type)
end
end

А код в модели выглядит следующим образом:

Транзакция Model.rb

class Transaction < ApplicationRecord
  after_create :update_balance
  def update_balance(transaction)
     @transaction = transaction
     if transaction.transaction_type == 'debit'
          deposit_balance
     else
          credit_balance
      end
   end

  def deposit_balance
    balance = @transaction.account.current_balance-= @transaction.amount
    if balance.positive?
      save_transaction
    end
  end

def credit_balance
  @transaction.account.current_balance += @transaction.amount
  save_transaction
end

private

  def save_transaction
    @transaction.account.save
    @transaction.save
  end
end

Этот код выдает ошибку как: wrong number of arguments (given 0, expected 1)> Поэтому добавлен параметр transaction в действии после создания. Но это не работает. Как это сделать?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Проблема в вашем контроллере:

def create
  @transaction = Transaction.new(transaction_params)
  @transaction.account = current_account
  redirect_to root_path
end

Вы инициализируете новый Transaction объект, но он никогда не сохраняется! Вам нужно позвонить @transaction.save для его создания, а затем обратный вызов сработает, как и ожидалось.

В противном случае вы могли бы использовать Transaction.create вместо Transaction.new, если это соответствует вашим потребностям, но с использованием ::new тогда save также вполне подойдет.


Вторая проблема: вы помещаете after_create :update_balance в модель Account, что означает, что она срабатывает при создании учетной записи, а не транзакции!

Попробуйте переместить его на правильную модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...