如何在Rails中使用after_create回调方法?

时间:2018-11-06 07:19:43

标签: ruby-on-rails callback

在控制器中创建操作后,我想与update_balance(transaction)参数一起调用transaction。 “ update_balance(transaction)”在模型中。代码如下: 交易控制器:

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

模型中的代码如下:

Transaction 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 :(得分:0)

问题出在您的控制器中

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

您正在初始化一个新的Transaction对象,但从未保存!您需要调用@transaction.save才能创建它,然后回调将按预期方式触发。

如果满足您的需要,也可以使用Transaction.create代替Transaction.new,但是使用::newsave也很好。


第二个问题:您正在将after_create :update_balance放入Account模型中,这意味着它将在创建帐户而不是交易时触发!

尝试将其移至正确的模型。