2012-05-08 9 views
19

en un modelo de rieles tengo un atributo is_subscriber, cuando construí una migración db para añadir esta columna a la base de datos que se especifica el valor predeterminado que es falsa:Rails valores predeterminados de la base de datos y validación de modelo para los campos booleanos

t.boolean "is_subscriber", :default => false 

también he especificado en el modelo que este atributo debe estar presente:

validates :is_subscriber, presence: true 

Entonces, ¿por qué recibo este error cuando se crea una instancia de modelo sin especificar este atributo?

2012-05-08T21:05:54+00:00 app[web.1]: ActiveRecord::RecordInvalid (Validation failed: Is subscriber can't be blank): 

Respuesta

42

De here

Si desea validar la presencia de un campo booleano (donde los valores reales son verdaderas y falsas), tendrá que utilizar validates_inclusion_of: nombre_campo,: en => [true, false] Esto se debe a a la forma Objeto # en blanco? maneja valores booleanos. falso.blanco? # => cierto

O en forma Rails3

validates :field, :inclusion => {:in => [true, false]} 
+0

Buen punto (votado), pero no creo que la regla de la base de datos lleve a que esto sea validado con éxito en ese caso tampoco, ¿no? –

+0

@SteveRowley ¿por qué no? Los rieles manejan la conversión de datos entre tipos, por lo que funciona como un amuleto. Tenga en cuenta que la sintaxis de migraciones también se traduce en sintaxis db. – Fabio

+0

¡Gracias por la solución! –

1

He resuelto esto con:

validates_presence_of :is_subscriber, :if => 'is_subscriber.nil?' 
1

Creo que es más limpio para envolver esto en un validador personalizado.

en /app/validators/is_boolean_validator.rb

class IsBooleanValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, parameters) 
    if !parameters.in? [true,false] 
     record.errors[attribute] << 'This must be true or false.' 
    end 
    end 
end 

entonces usted tiene que asegurarse de que esto se carga añadiendo lo siguiente a /config/application.rb

config.autoload_paths += %W["#{config.root}/app/validators/"] 

(no se olvide de reiniciar el servidor para cargar este)

Puede validar más claramente con

validates: :field1, field2, is_boolean: true 
Cuestiones relacionadas