carriles incorporados en la validación de fecha y hora

¿Los raíles hacen alguna validación de fecha y hora? Encontré un complemento http://github.com/adzap/validates_timeliness/tree/master , pero parece que algo debería venir de la caja.

No hay un validador de ActiveRecord incorporado para DateTimes, pero puede agregar fácilmente este tipo de capacidad a un modelo de ActiveRecord, sin usar un complemento, con algo como esto:

 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 

La respuesta de Gabe no funcionó para mí, así que esto es lo que hice para validar mis fechas:

 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 

Solo quería validar que la fecha es, de hecho, una fecha, y no una cadena, carácter, int, flotante, etc.

La validación de fecha más compleja se puede encontrar aquí: https://github.com/codegram/date_validator

Las versiones recientes de Rails escribirán valores de conversión antes de la validación, por lo que los valores no válidos se pasarán como nil a los validadores personalizados. Estoy haciendo algo como esto:

 # 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 

Puede crear un validador de fecha y hora personalizado por usted mismo

1) crear una carpeta llamada validadores en el directorio de aplicaciones internas

2) crea un archivo datetime_validator.rb. con el siguiente contenido dentro del directorio de aplicaciones / validadores

  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) Aplicar esta validación en el modelo

 class YourModel < ActiveRecord::Base validates :happend_at, datetime: true end 

4) Agregue la siguiente línea en application.rb

 config.autoload_paths += %W["#{config.root}/app/validators/"] 

5) Reinicie su aplicación de Rails

Nota: El método anterior probado en Rails 4

Recomiendo una gem date_validator . Ver https://rubygems.org/gems/date_validator . Está bien mantenido y su API es simple y compacta.

Es muy necesario validar las fechas. Con los ayudantes de formulario predeterminados de Rails, puede seleccionar fechas como el 31 de septiembre.