Rails日期验证和条件验证(如果将来)?方法

时间:2018-08-23 18:40:12

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

我发现了一些重复的问与答;但是,我没有弄清楚。

我有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

2 个答案:

答案 0 :(得分:0)

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

import { Template } from 'meteor/templating'
import { ReactiveVar } from 'meteor/reactive-var'

import './fetch.html'

Template.fetch.onCreated(function helloOnCreated () {
  // counter starts at 0
  this.source = new ReactiveVar(null)
})

Template.fetch.helpers({
  source () {
    return Template.instance().source.get()
  },
})

Template.fetch.events({
  'click #fetchbutton' (event, instance) {
    Meteor.call('getAudio', 'https://www.sample-videos.com/audio/mp3/crowd-cheering.mp3', (err, uint8Array) => {
      const blob = new Blob([uint8Array], {type: 'audio/mpeg'})
      instance.source.set(window.URL.createObjectURL(blob))
    })
  },
})

答案 1 :(得分:0)

谢谢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