2010-12-29 7 views
1

Ich muss ein Feld namens phone_number in meiner rails3 App validieren. Dieses Feld ist optional, aber wenn ein Benutzer eine Telefonnummer eingibt, überprüfe ich das Format. Der RSpec2 Test läuft gut, aber wenn ich in die sign_up Ansicht gehe und das Feld phone_number nicht berühre, werde ich zu einem "Telefonnummer ist zu kurz (Minimum ist 6 Zeichen)" und "Telefonnummer ist ungültig" Fehler.Nur ein Rails3-Modell validieren, wenn ein Wert eingegeben wurde

Was ist das Problem in meinem Modell? Mein Ziel ist es, die Telefonnummer zu validieren, wenn ein Benutzer dies eingibt, wenn die Nummer leer ist, werde ich eine Null in meiner Datenbank speichern.

Das ist mein User-Modell:

class User < ActiveRecord::Base 
    belongs_to :address 
    accepts_nested_attributes_for :address 

    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, :lockable and :timeoutable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :confirmable, :lockable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_readonly :username 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :phone_number, :username, :newsletter, :address_attributes 

    validates :username, :presence => true, :uniqueness => true, :length => {:minimum => 4, :maximum => 16 }, :format => { :with => /\A[a-z0-9][a-z0-9._-]*\z/i } 
    validates :phone_number, :length => {:minimum => 6, :maximum => 25}, :format => { :with => /\A\S[0-9\+\/\(\)\s\-]*\z/i }, :allow_nil => true 
    validates :address, :presence => true 
end 

Meine Rspec Methode die phone_number zu testen:

it "should be valid without an phonenumber" do 
    Factory.build(:user, :phone_number => nil).should be_valid 
    end 

    it "should be invalid with an invalid phonenumber" do 
    invalid_phonenumbers.each do |invalid| 
     Factory.build(:user, :phone_number => invalid).should_not be_valid 
    end 
    end 

    it "should be valid with an valid phonenumber" do 
    valid_phonenumbers.each do |valid| 
     Factory.build(:user, :phone_number => valid).should be_valid 
    end 
    end 

    def invalid_phonenumbers 
    ["Hans Wurst","+49 221 Hans","Gebe ich nicht ein","  ","110",""] 
    end 

    def valid_phonenumbers 
    ["+492203969534","0221/549534","0800-2222 800","+49-0221-2222-390","+49 (221)/549534 - 23","+49 (0) 221/549534 - 23","0221269534"]   
    end 

Antwort

6

versuchen, dies statt: allow_nil => true,: allow_blank => true

validates :phone_number, :length => {:minimum => 6, :maximum => 25}, :format => { :with => /\A\S[0-9\+\/\(\)\s\-]*\z/i }, :allow_blank => true 
+0

Thx das funktioniert mit der Aussicht. Aber in meiner rspec ist die Telefonnummer "" gültig. Ich habe keinen leeren Stich in meiner Datenbank – ThreeFingerMark

+0

Wie ist es: present => false –

+0

: Präsenz => false löst eine Ausnahme aus. – Abdo

Verwandte Themen