Предоставляет ли рельсы какое-либо подтверждение для даты и времени? Я нашел плагин http://github.com/adzap/validates_timeliness/tree/master, но это похоже на то, что должно появиться из коробки.
Рельсы, встроенные в проверку даты и времени
Ответ 1
Нет встроенного средства проверки ActiveRecord для DateTimes, но вы можете легко добавить эту возможность к модели ActiveRecord без использования плагина с чем-то вроде этого:
class Thing < ActiveRecord::Base
validate :happened_at_is_valid_datetime
def happened_at_is_valid_datetime
errors.add(:happened_at, 'must be a valid datetime') if ((DateTime.parse(happened_at) rescue ArgumentError) == ArgumentError)
end
end
Ответ 2
Ответ Gabe не помог мне, поэтому вот что я сделал для подтверждения моих дат:
class MyModel < ActiveRecord::Base
validate :mydate_is_date?
private
def mydate_is_date?
if !mydate.is_a?(Date)
errors.add(:mydate, 'must be a valid date')
end
end
end
Я просто хотел проверить, что дата на самом деле является датой, а не строкой, символом, int, float и т.д.
Более сложную проверку даты можно найти здесь: https://github.com/codegram/date_validator
Ответ 3
Последние версии Rails будут задавать значения перед валидацией, поэтому недопустимые значения будут передаваться как nil
в пользовательские валидаторы. Я делаю что-то вроде этого:
# app/validators/date_time_validator.rb
class DateTimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if record.public_send("#{attribute}_before_type_cast").present? && value.blank?
record.errors.add(attribute, :invalid)
end
end
end
# app/models/something.rb
class Something < ActiveRecord::Base
validates :sold_at, date_time: true
end
# spec/models/something_spec.rb (using factory_girl and RSpec)
describe Something do
subject { build(:something) }
it 'should validate that :sold_at is datetimey' do
is_expected.not_to allow_value(0, '0', 'lorem').for(:sold_at).with_message(:invalid)
is_expected.to allow_value(Time.current.iso8601).for(:sold_at)
end
end
Ответ 4
Вы можете самостоятельно создать собственный валидатор дат.
1) создайте папку, называемую валидаторами внутри каталога приложения
2) создайте файл datetime_validator.rb. со следующим содержимым внутри каталога приложений/валидаторов
class DatetimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if ((DateTime.parse(value) rescue ArgumentError) == ArgumentError)
record.errors[attribute] << (options[:message] || "must be a valid datetime")
end
end
end
3) Примените эту проверку на модели
class YourModel < ActiveRecord::Base
validates :happend_at, datetime: true
end
4) Добавьте строку ниже в application.rb
config.autoload_paths += %W["#{config.root}/app/validators/"]
5) Перезапустите приложение для рельсов
Примечание: описанный выше метод протестирован в рельсах 4
Ответ 5
Я рекомендую камень date_validator
. См. https://rubygems.org/gems/date_validator. Он хорошо поддерживается, и его API прост и компактен.
Ответ 6
Нужно проверить даты. С помощью получателей формы Rails по умолчанию вы можете выбрать даты, такие как 31 сентября.