【问题标题】:How to disable other validations in case more important validation error is caught如果发现更重要的验证错误,如何禁用其他验证
【发布时间】:2017-02-20 06:48:22
【问题描述】:

我希望将(数字)模型属性 foo 验证为

  • (1) 存在,并且
  • (2) 大于等于0。

由于 (1) 是 (2) 的先决条件,如果没有为参数 foo 指定值,我希望验证仅报告与 (1) 相关的错误,而不是 (2)。

我试着这样做:

validates :foo_attribute,
  numericality: {greater_than_or_equal_to: 0},
  presence: true

但是当参数 :foo 的给定值不存在时,我会在 errors 中收到来自验证 (1) 和 (2) 的消息。

在这种情况下,我怎样才能只得到与 (1) 而不是 (2) 相关的验证错误?

【问题讨论】:

  • 是否可以选择使用 2 个单独的验证行来验证存在性和数量性?
  • @sajan 那会让事情变得更糟。
  • 我认为你需要编写自己的验证方法
  • @sawa 我在暗示类似validates :foo_attribute, numericality: {greater_than_or_equal_to: 0}, if: 'foo_attribute.present?'
  • @sajan 我明白了。那可行。但如果那是我应该走的路,那么我想知道validates :foo_attribute, numericality: {greater_than_or_qaeusl_to: 0}, presence: true 语法的目的是什么(这很优雅但不起作用)。好像没用。

标签: ruby-on-rails validation error-handling


【解决方案1】:

看起来内部 validates() 只是将其拆分为多个验证:

def validates(*attributes)
  defaults = attributes.extract_options!.dup
  validations = defaults.slice!(*_validates_default_keys)

  raise ArgumentError, "You need to supply at least one attribute" if attributes.empty?
  raise ArgumentError, "You need to supply at least one validation" if validations.empty?

  defaults[:attributes] = attributes

  validations.each do |key, options|
    next unless options
    key = "#{key.to_s.camelize}Validator"

    begin
      validator = key.include?('::') ? key.constantize : const_get(key)
    rescue NameError
      raise ArgumentError, "Unknown validator: '#{key}'"
    end

    validates_with(validator, defaults.merge(_parse_validates_options(options)))
  end
end

在这种情况下,您必须编写自己的方法或执行以下操作:

validates_presence_of :foo_attribute
validates_numericality_of :foo_attribute, greater_than: 0, unless: Proc.new { |foo_instance| foo_instance.foo_attribute.nil? }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2020-11-01
    • 2015-02-15
    • 2018-02-02
    相关资源
    最近更新 更多