验证失败,因为验证状态不符合Rails 5

时间:2019-03-01 06:36:29

标签: ruby-on-rails

我的Transaction模型属于2个UserWalletsender_walletreceiver_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')

它以相同的方式失败

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

所有验证将被一一撤销。因此,按照您的代码,首先,它将先验证存在性,然后验证validate_balance。

现在,在validate_balance验证中,您有sender_wallet nil导致此错误。

可以通过以下三种方法在validate_balance方法之前更好地检查sender_wallet是否存在:

  1. 在您的验证码中

    validate :validate_balance, on: :create, if: -> { sender_wallet_id.present? }
    
  2. 在您的validate_balance方法中

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

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