ruby-on-rails - generate - rails update attribute
problema con pasar booleanos a atributos_actualizados (3)
Tengo el siguiente modelo:
class GuestCatering < ActiveRecord::Base
# Validation
validates :name, :presence => true
validates :order_number, :presence => true
validates :orderable, :presence => true
end
Pero cuando intente actualizar un GuestCatering existente con el siguiente código:
guest_catering.update_attributes(:orderable => false)
La variable de catering de invitados es un objeto válido de GuestCatering. El objeto guest_catering tiene errores después de la actualización, así:
<{[:orderable, ["can''t be blank"]]=>nil}>
Pero cuando paso un orderable => true , todo está bien y no hay errores.
¿Qué pasa aquí, por qué no puedo configurar orderable a falso?
Como ya dijo Dan Cheail en su respuesta, un booleano nil y false es semánticamente la misma cosa.
Pero, si realmente necesita validarlo (no permite nada), siempre puede hacer:
validates_inclusion_of :orderable, :in => [true, false]
En lugar de validates :presence => :true , debe escribir sus migraciones con el valor predeterminado de esta manera:
t.boolean :orderable, :default => 0
Supongo que su valor predeterminado debe ser false . Si es true , use 1 como predeterminado. Luego establecerá el valor predeterminado en la base de datos. Por lo tanto, puede omitir la verificación de validación.
La razón por la que no puede usar validates :presence es respondida por @dan. La presencia significa que no está en blanco y los rieles usan .blank? función para esto y false.blank? es true
Su modelo se está comportando exactamente como se lo indicó, mediante el uso de validates :orderable, :presence => true
No tiene mucho sentido validar la presencia de una bandera booleana: va a ser true , nil o false , y en Ruby world, nil y false tienen el mismo valor semántico en lo que respecta a la lógica booleana.
Internamente, validates :presence basa en el valor del atributo que se está comprobando para devolver false cuando está en blank? se llama. Y, en Rails (con ActiveSupport), false.blank? se evalúa como true , lo que significa que su campo está fallando en la validación.
Simplemente elimine esa validación y todo funcionará como se espera.