ruby-on-rails - now - ruby datetime
Rails inválido datetime en resultados del modelo en cero (1)
Una solución alternativa sería mover la parte allow_nil
a la validación date_time
:
class DatetimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if value.blank?
value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.")
end
end
class Foo
validates :my_date, :datetime => true
end
Edición: creo que es un problema con el encasillado. Pruebe esto (adaptado del código para validates :numericality
):
def validate_each(record, attribute, value)
before_type_cast = "#{attribute}_before_type_cast"
raw_value = record.send(before_type_cast) if record.respond_to?(before_type_cast.to_sym)
raw_value ||= value
return if raw_value.blank?
raw_value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.")
end
Tengo un modelo con un atributo de fecha y hora. Estoy tratando de validar el JSON entrante que actualizaría el modelo. Pero ActiveRecord parece estar estableciendo el valor del atributo en nil si es una fecha y hora no válida. No puedo responder con el error apropiado porque se permite que el atributo sea nulo. ¿Qué estoy haciendo mal?
Código:
class DatetimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.")
end
end
class Foo
# column :my_date, :datetime
validates :my_date, :allow_nil => true, :datetime => true
end
Consola:
1.9.3p125 :001 > x = Foo.new
=> #<Foo id: nil, my_date: nil>
1.9.3p125 :001 > x.my_date = ''bad value''
=> ''bad value''
1.9.3p125 :001 > x.my_date
=> nil
1.9.3p125 :001 > x.valid?
=> true
En lo que respecta a ActiveRecord, establecer el atributo datetime en ''bad_value'' es equivalente a establecerlo en nil, por lo que no puedo validarlo, ya que no se requiere my_date. Esto me parece un error. ¿Cuál es la mejor solución?
¡Gracias!