【问题标题】:Ruby on Rails: Running custom validation function only when other properties are presentRuby on Rails:仅在存在其他属性时运行自定义验证功能
【发布时间】:2017-08-29 15:07:46
【问题描述】:

我希望我的自定义验证器仅在它使用的属性存在时运行。

# these are all dates
validates :start_time, presence: true
validates :end_time, presence: true
validates :deadline_visitor, presence: true
validates :deadline_host, presence: true

# these validate the above dates
validate :validate_all_dates
validate :validate_dates

示例:

def validate_all_dates
  if self.start_time > self.end_time
    errors.add(:start_time, 'must be before or the same day as end time')
  end
end

因为self.start_timeself.end_time 不存在而失败

【问题讨论】:

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


    【解决方案1】:

    您可以在validate 方法中添加if 参数,这可以检查所需的条件。该参数可以是 proc:

    validates :validate_all_dates, if: Proc.new { |model| model.start_time.presence }
    

    或者用一个方法:

    validate :validate_all_dates, if: :dates_present?
    
    def dates_present?
      start_time.presence && end_time.presence
    end
    

    查看本指南了解更多详情:Conditional Validation

    【讨论】:

      【解决方案2】:

      您可以在验证器本身中添加变量的存在:

      def validate_all_dates
        if self.start_time && self.end_time && self.start_time > self.end_time
          errors.add(:start_time, 'must be before or the same day as end     time')
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2021-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        • 1970-01-01
        • 2012-04-29
        • 2019-03-02
        • 2013-04-16
        相关资源
        最近更新 更多