2012-05-22 7 views
14

In un'applicazione Rails ho diversi attributi interi su un modello.In alcuni casi, come convalidare la numericalità e l'inclusione pur consentendo l'attributo nullo?

Un utente deve essere in grado di creare un record e lasciare questi attributi vuoti.

Oppure, se l'utente immette i valori per questi attributi, devono essere convalidati per la numericità e all'interno di un determinato intervallo.

Nel modello che ho qualcosa di simile

validates_presence_of :name  
validates_numericality_of :a, :only_integer => true, :message => "can only be whole number." 
validates_inclusion_of :a, :in => 1..999, :message => "can only be between 1 and 999." 

Se io ora prova con gli attributi minimi richiesti per salvare:

factory :model do 
    sequence(:name) { |n| "model#{n}" } 
end 

it "should save with minium attributes" do 
    @model = FactoryGirl.build(:model) 
    @model.save.should == false 
end 

ottengo

Validation failed: a can only be whole number., a can only be between 1 and 999. 

Come posso convalida la numericalità e l'inclusione solo se viene fornito un valore per :a, pur consentendo ancora :a in alcuni casi essere nullo?

Grazie

risposta

29

È possibile aggiungere un :allow_nil => true al vostro validates_numericality_of.

validates_numericality_of :a, :only_integer => true, :allow_nil => true, 
    :message => "can only be whole number." 

è anche possibile utilizzare greater_than_or_equal_to e less_than_or_equal_to opzioni se si desidera utilizzare una convalida:

validates_numericality_of :a, :only_integer => true, :allow_nil => true, 
    :greater_than_or_equal_to => 1, 
    :less_than_or_equal_to => 999, 
    :message => "can only be whole number between 1 and 999." 
+0

grazie, ottima risposta –

3

dovrebbe essere semplicemente:

validates_numericality_of :a, :only_integer => true, :message => "can only be whole number.", :allow_nil => true 

stesso per la seconda convalida

+0

grazie, questo era proprio quello che mi serviva. Ho dato la risposta a Shadwell per il suo codice DRY. Vergogna, non posso contrassegnare entrambi come corretti. –

Problemi correlati