2012-11-05 13 views
9

Ho un modello simile alla seguente,Rails convalida presenza non sul valore 0

class Activity < ActiveRecord::Base 
    attr_accessible :name, :admin 

    validates :name, :presence => true 
    validates :admin, :presence => true 
end 

La proprietà name è una stringa e la proprietà di amministrazione è definita come un valore booleano nella migrazione.

Se provo a creare un'istanza del modello nella console utilizzando,

a = Activity.create(:name => 'Test', :admin => 0) 

Poi la convalida non riesce dicendo che ho bisogno di fornire un valore per Admin. Perché? Ho fornito un valore.

Ho potuto capire se non ero riuscito a fornire un valore o se avessi fornito nulla. Ma perché un valore come 0 (o anche falso per quella materia) causa il fallimento della convalida?

risposta

17

validates :presence utilizza blank? per determinare se è presente un valore. Ma false.blank? => true. Quindi la validazione fallisce, perché blank? sta dicendo ad ActiveRecord che nessun valore è presente.

È possibile riscrivere questo come:

validates :field_name, :inclusion => { :in => [true, false] }

come raccomandato nel Rails Guides: ActiveRecord Validations

vedi anche A concise explanation of nil v. empty v. blank in Ruby on Rails

+0

ha senso per me immagino . Ma immagino di non essere ancora d'accordo su false.blank? o 0. bianco? dovrebbe restituire true – richard

+0

Abbastanza giusto, ma dovrai prenderlo con i ragazzi che hanno scritto Rails :) – zetetic

+0

+1. La soluzione funziona. Ma vorrei anche che Rails lo gestisse meglio. Il messaggio di errore quando si utilizza la soluzione qui è ': upgradeed_kitchen_bathrooms => [" non è incluso nell'elenco "]" che è orribile considerando la semplicità di ciò che cerchiamo. –

0

Rails 4/5

validates :name, absence: true 
Problemi correlati