2016-08-01 16 views
0

ich an einer Aufgabe arbeiten, die, unter vielen anderen, die folgende Anforderung hat:Individuelle Schienen-Validator, die eine von zwei Elemente erlaubt null zu sein, aber nicht beide

Define custom validator that permits first_name or last_name to be null but not both 

ich etwas haben, das funktioniert, aber ich bin ganz sicher, dass es nicht korrekt ist:

Ich weiß nicht, wie ich das komplett testen sollte. Was ich oben habe, testet nur, ob beide null sind. Die Tatsache, dass ich nur :first_name zu dem Fehler-Array hinzufüge, sagt mir schon, dass etwas nicht stimmt.

Wäre das ein if/else? Arbeiten diese in Validierungen?

EDIT: Die Tests, die ich versuche, den Ball zu machen:

it "does not allow a Profile with a null first and last name" do 
    expect(Profile.new(:first_name=>nil, :last_name=>nil, :gender=>"male")).to_not be_valid 
end 
it "allows a Profile with a null first name when last name present" do 
    expect(Profile.new(:first_name=>nil, :last_name=>"Smith", :gender=>"male")).to be_valid 
end 
it "allows a Profile with a null last name when first name present" do 
    expect(Profile.new(:first_name=>"Joe", :last_name=>nil, :gender=>"male")).to be_valid 
end 
+0

Sie sollten die Antwort richtig markieren, wenn es Ihnen hilft. – Nickey

Antwort

0

In Ihrem Fall Sie && Operator verwenden. Welcher Scheck für beide. versuchen Sie stattdessen ||, die für beide überprüfen wird. Ändern Sie wie unten.

def at_least_one_name 
    if first_name.present? || last_name.present? 
    errors.add(:first_name, "Must contain at least a first or last name") 
    end 
end 

Es gibt auch andere Möglichkeiten, auch wie folgt aus:

validates :first_name, presence: true, unless: ->(user){user.last_name.present?} 
validates :last_name, presence: true, unless: ->(user){user.first_name.present?} 
0

die von Dipak G. bereitgestellten Informationen verwenden ich in der Lage war, zu einer Lösung zu kommen:

def at_least_one_name 
    unless first_name.present? || last_name.present? 
    errors.add(:user, "Must contain at least a first or last name" 
    end 
end 

Dies funktioniert und was nicht breche alle anderen Tests.