【问题标题】:Rails validation dependent on associated objectRails 验证依赖于关联对象
【发布时间】:2014-08-16 08:37:54
【问题描述】:

所以我正在编写需要退款的代码。我写了一个退款验证器来检查以确保退款不超过原始费用。然而,在我的规格中,我意识到相关的费用还没有出现。使用因子女孩。我怎样才能做出这样的事情?

验证器

class RefundValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value <= record.charge.amount
      record.errors[:attribute] << "is greater than original charge"
    end
  end
end

验证

validates :amount, refund: true

工厂

FactoryGirl.define do
  factory :refund do
    association :client
    association :charge
    amount 99
  end
end

规格

context 'validations' do
  %i(client_id therapist_id appointment_id booking_id value).each do |attr|
    it { is_expected.to validate_presence_of attr }
  end
  it { is_expected.to validate_numericality_of(:value).is_greater_than_or_equal_to(0).is_less_than_or_equal_to(5) }
end

错误(我在存在规范中得到了所有 4 个属性,而不仅仅是 client_id):

1) Refund validations should require client_id to be set
 Failure/Error: it { is_expected.to validate_presence_of attr }
 NoMethodError:
   undefined method `amount' for nil:NilClass
 # ./app/validators/refund_validator.rb:3:in `validate_each'
 # ./spec/models/refund_spec.rb:20:in `block (4 levels) in <top (required)>'

我已尝试使用明确指定的充电工厂来明确创建工厂模型,但无济于事。不知道发生了什么事。任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby rspec tdd


    【解决方案1】:
    • 为了便于阅读,我会将unless x &lt;= y 更改为if x &gt; y
    • 在任何情况下,您都应该使用record.try(:charge).try(:amount) 而不是record.charge.amount 来防止您的验证器中出现NoMethodErrors。

    让我知道这是否已经解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多