2012-05-08 13 views
19

in un modello di Rails ho un attributo is_subscriber, quando ho costruito una migrazione db per aggiungere questa colonna alla base di dati ho specificato il valore di default di essere falsa:Rails valori predefiniti del database e la validazione dei modelli per i campi booleani

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

ho anche specificato nel modello che questo attributo deve essere presente:

validates :is_subscriber, presence: true 

Allora perché ottengo questo errore quando creo un'istanza modello senza specificare questo attributo?

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

risposta

42

Da here

Se si desidera verificare la presenza di un campo booleano (dove i valori reali sono vero e falso), si vuole utilizzare validates_inclusion_of: nome_campo,: in => [true, false] Questo è dovuto allo per il modo in cui # # Oggetto è vuoto? gestisce valori booleani. false.blank? # => vero

O in modo Rails3

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

Buon punto (votato in alto), ma non penso che la regola del database porterebbe a questo essere validato con successo anche in questo caso, giusto? –

+0

@SteveRowley perché no? Rails gestisce la conversione dei dati tra i tipi, quindi funziona come un incantesimo. Tieni presente che la sintassi delle migrazioni viene anche tradotta in sintassi db. – Fabio

+0

Grazie per la soluzione! –

1

Ho risolto questo con:

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

penso che sia più ordinato per avvolgere questo in un validatore personalizzato.

in /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 

poi si deve assicurarsi che questa sia caricata aggiungendo quanto segue al /config/application.rb

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

(non dimenticate di riavviare il server per caricare questo)

È quindi possibile convalidare più ordinatamente con

validates: :field1, field2, is_boolean: true 
Problemi correlati