我的 Transaction
模型属于 2 个 UserWallet
(sender_wallet
,receiver_wallet
) 实例。
我验证这两个实例是否存在,以及其他属性货币、金额...
创建时,我还确保 sender_wallet
有足够的资金来创建该交易
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
问题是,当对 sender_wallet 使用 belong_to
shoulda-matcher 时,它将 sender_wallet 设置为 nil,并调用 validate_balance 抛出异常
NoMethodError: undefined method `balance' for nil:NilClass
难道不会因为未设置 sender_wallet 而失败吗? 我尝试使用控制台深入研究它,当我这样做时
Transaction.create(amount: 10000, currency: 'EUR')
同样失败
感谢您的帮助
最佳答案
所有验证都将一一撤销。因此,根据您的代码,首先,它将验证存在,然后验证 validate_balance。
现在,在 validate_balance 验证中,您的 sender_wallet nil 导致了此错误。
在 validate_balance 方法之前通过以下三种方式更好地检查 sender_wallet 是否存在:
在您的验证代码中
validate :validate_balance, on: :create, if: -> { sender_wallet_id.present? }
在您的 validate_balance 方法中
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
关于ruby-on-rails - 验证失败,因为验证存在未得到遵守rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54939181/