【问题标题】:Rails date validation with conditional validation if and future? methodRails 日期验证和条件验证 if 和 future?方法
【发布时间】:2018-08-23 18:40:12
【问题描述】:

我发现了一些重复的问答;但是,我没有弄明白。

我有House 具有:available_at 验证的模型(该字段是Date)。我正在努力实现这样的目标。

可用日期必须在将来。

# db/schema.rb
create_table "houses", force: :cascade do |t|
  # ...
  t.date "available_at", null: false
  # ...
end

# app/models/house.rb
class House < ApplicationRecord
  validates :available_at, presence: true, if: -> { available_at.future? }
end

另外,这里是PR


重复答案
Conditional Validation RAILS MODEL
Conditional validation if another validation is valid
Rails validate uniqueness only if conditional
rails date validation with age
How do I validate a date in rails?
https://codereview.stackexchange.com/questions/110262/checking-for-valid-date-range-in-rails

【问题讨论】:

    标签: ruby-on-rails validation rails-activerecord


    【解决方案1】:

    这对于验证 available_at 的自定义方法来说似乎是一个很好的用例...

    class House < ApplicationRecord
      validate :available_at_is_in_the_future
    
      def available_at_is_in_the_future
        if available_at.present? && available_at <= Date.today
          errors.add(:available_at, "must be in the future")
        end
      end
    end
    

    【讨论】:

    • 感谢您的回答。现在,它就像魅力一样,但我需要更新 RSpecs。之后我将标记为答案。
    • 谢谢马克。我添加了我的答案。你可以去看看!
    • 是的,你是对的,但关键是模型应该做模型的工作。
    【解决方案2】:

    感谢Mark Merritt,因为我启发了他的answer

    实际上答案很完美,但问题是保持模型 DRY,而且它的方法名称很长。

    这就是我所做的。 Pull requestcommit

    我创建了名为at_future_validator.rb 的单独验证器。我将文件放在lib/validators 文件夹中。

    然后,我写了这个验证器

    # lib/validators/at_future_validator.rb
    class AtFutureValidator < ActiveModel::EachValidator
      def validate_each(object, attribute, value)
        if attribute.present? && value < Date.today
          object.errors[attribute] << (options[:message] || 'must be in the future')
        end
      end
    end
    

    好的。第一部分已经完成。重要的部分是,我现在在 guide 上看到的,它与我们命名为 at_future_validator 的自定义验证器一起工作。我们需要在 house 模型中使用验证器。

    # app/models/house.rb
    class House < ApplicationRecord
      require_dependency 'validators/at_future_validator.rb'
      # ...
      validates :available_at, presence: true, at_future: true
      # ...
    end
    

    我遵循的指南
    #211 Validations in Rails 3 - 8:09

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多