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.