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
Recomiendo una gema date_validator
. Ver https://rubygems.org/gems/date_validator . Está bien mantenido y su API es simple y compacta.