【问题标题】:Same custom validation for several fields in RailsRails 中多个字段的相同自定义验证
【发布时间】:2011-02-21 16:58:02
【问题描述】:

我在 Rails 应用程序的模型中有四个 date_time 字段。我想对它们应用相同的验证方法,以便只接受有效的日期时间。验证方法来自早期的question 堆栈溢出:

  validate :datetime_field_is_valid_datetime

  def datetime_field_is_valid_datetime
    errors.add(:datetime_field, 'must be a valid datetime') if ((DateTime.parse(datetime_field) rescue ArgumentError) == ArgumentError) && !datetime_field.nil? && !datetime_field.blank?
  end

除了为每个 DateTime 字段定义四个完全相同的方法之外,还有更优雅的方法来验证这些字段吗?

【问题讨论】:

    标签: ruby-on-rails validation


    【解决方案1】:

    最好的解决方案是创建自己的验证器:

    class MyModel < ActiveRecord::Base
      include ActiveModel::Validations
    
      class DateValidator < ActiveModel::EachValidator
        def validate_each(record, attribute, value)
          record.errors[attribute] << "must be a valid datetime" unless (DateTime.parse(value) rescue nil)
        end
      end
      validates :datetime_field, :presence => true, :date => true
      validates :another_datetime_field, :presence => true, :date => true
      validates :third_datetime_field, :presence => true, :date => true
    end
    

    UPD

    您可以通过这种方式共享相同的验证:

      validates :datetime_field, :another_datetime_field, :third_datetime_field, :presence => true, :date => true
    

    【讨论】:

      【解决方案2】:
      def self.validate_is_valid_datetime(field)
        validate do |model|
          if model.send("#{field}?") && ((DateTime.parse(model.send(field)) rescue ArgumentError) == ArgumentError)
            model.errors.add(field, 'must be a valid datetime')
          end
        end
      end
      
      validate_is_valid_datetime :datetime_field
      

      【讨论】:

        猜你喜欢
        • 2012-11-30
        • 1970-01-01
        • 2017-06-21
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2015-10-18
        • 2018-06-08
        相关资源
        最近更新 更多