我发现了一些重复的问与答;但是,我没有弄清楚。
我有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
答案 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 request和commit
我创建了一个单独的验证器,名称为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