Ruby on rails 验证失败,因为验证存在性不受rails 5的尊重

Ruby on rails 验证失败,因为验证存在性不受rails 5的尊重,ruby-on-rails,Ruby On Rails,我的交易模型属于两个UserWallet发送者、接收者和钱包实例。 我验证了这两个实例的存在,以及其他属性货币、金额。。。 在创建时,我还要确保发件人的钱包有足够的钱来创建该交易 class Transaction < ApplicationRecord belongs_to :sender_wallet, class_name: 'UserWallet' belongs_to :receiver_wallet, class_name: 'UserWallet' valida

我的交易模型属于两个UserWallet发送者、接收者和钱包实例。 我验证了这两个实例的存在,以及其他属性货币、金额。。。 在创建时,我还要确保发件人的钱包有足够的钱来创建该交易

class Transaction < ApplicationRecord
  belongs_to :sender_wallet, class_name: 'UserWallet'
  belongs_to :receiver_wallet, class_name: 'UserWallet'

  validates :sender_wallet, :receiver_wallet, :amount, :currency, presence: true

  validate :validate_balance, on: :create

  def validate_balance
    if sender_wallet.balance < amount
      errors.add(:amount, 'Not enough money')
    end
  end
end
这不应该因为发送者的钱包没有设置而失败吗? 我试着用控制台来研究它,当我这样做的时候

Transaction.create(amount: 10000, currency: 'EUR')
它以同样的方式失败


感谢您的帮助

所有验证将逐一撤销。因此,根据您的代码,首先,它将验证存在,然后验证平衡

现在,在validate_balance validation中,您有导致此错误的发件人\u wallet nil

在通过以下三种方式验证\u余额方法之前,更好地检查发件人\u钱包是否存在:

在您的验证代码中

validate :validate_balance, on: :create, if: -> { sender_wallet_id.present? }
在您的验证_平衡方法中

def validate_balance
  if sender_wallet.present? && sender_wallet.balance < amount
     errors.add(:amount, 'Not enough money')
  end
end
使用try:attribute,这不会生成异常

def validate_balance   
  if sender_wallet.try(:balance) < amount
    errors.add(:amount, 'Not enough money') 
  end 
end

谢谢你的回答。老实说,如果我事后还要检查,我不明白验证发件人的钱包是否存在的意义。仅供参考,它在rails 4中工作正常
def validate_balance   
  if sender_wallet.try(:balance) < amount
    errors.add(:amount, 'Not enough money') 
  end 
end