12

我正在 ActiveRecord 中编写一个自定义验证器,以便截止日期有意义:

  validate :deadline_is_possible?

  def deadline_is_possible?
    if deadline > begins_at
      errors.add(:deadline, 'must be possible')
    end
  end

然而,这会生成一个“NoMethodError: undefined method `>' for nil:NilClass”。我试图将日期转换为字符串,例如:

  def deadline_is_possible?
    if deadline.to_s > begins_at.to_s
      errors.add(:deadline, 'must be possible')
    end
  end

尽管它不会产生错误,但也不起作用。

我还声明了其他验证器(例如

  def begins_at_is_date?
    if !begins_at.is_a?(Date)
      errors.add(:begins_at, 'must be a date')
    end
  end

那行得通。

4

2 回答 2

9

如果其中一个日期为零,您可能需要处理。您可以将这些设置为在截止日期数据库中具有默认值,或者执行以下操作:

  validate :deadline_is_possible?

  def deadline_is_possible?
    return if [deadline.blank?, begins_at.blank?].any?
    if deadline > begins_at
      errors.add(:deadline, 'must be possible')
    end
  end
于 2012-05-18T16:34:29.230 回答
9

您可以添加自己的验证器:

class AfterDateValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    return if value.blank?

    other_date = record.public_send(options.fetch(:with))

    return if other_date.blank?

    if value < other_date
      record.errors.add(attribute, (options[:message] || "must be after #{options[:with].to_s.humanize}"))
    end
  end
end

并在模型中使用它:

validates :invited_on, presence: true
validates :selected_on, presence: true, after_date: :invited_on
于 2019-07-17T16:47:41.550 回答