我的Transaction
模型属于2个UserWallet
(sender_wallet
,receiver_wallet
)实例。
我验证了这两个实例的存在以及其他属性currency, amount...
在创建时,我还要确保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')
它以相同的方式失败
感谢您的帮助
答案 0 :(得分:4)
所有验证将被一一撤销。因此,按照您的代码,首先,它将先验证存在性,然后验证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