validator validations validates validate rails method greater_than custom create ruby-on-rails validation

ruby-on-rails - validations - rails validates if



carriles incorporados en la validaciĆ³n de fecha y hora (6)

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

¿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.


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


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


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 rieles

Nota: El método anterior probado en rieles 4