ruby-on-rails - 验证失败,因为验证存在未得到遵守rails 5

标签 ruby-on-rails

我的 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 是否存在:

  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
    

关于ruby-on-rails - 验证失败,因为验证存在未得到遵守rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54939181/

相关文章:

ruby-on-rails - 未使用 RoR 4、Nginx、Unicorn 提供的 Assets

ruby-on-rails - 如何查询包含数组的jsonb字段

ruby-on-rails - 如何使用 Rails 生成迁移以添加引用?

ruby-on-rails - 如何在 Rails 中建模和创建自定义一副纸牌?

ruby-on-rails - Rails Slim语法错误

ruby-on-rails - rspec 版本 2.14 的未定义方法 `rspec_reset'

ruby-on-rails - 在 Rails 中使用 POST 的持久/保持事件 HTTP 连接

ruby-on-rails - 如何跳过使用设备确认电子邮件地址更新的需要?

ruby-on-rails - rails 3 : "uninitialized constant Formtastic::FormBuilder" error after deploying app on production server

ruby-on-rails - 在 Rails 应用程序中使用模块建模