2012-04-09 15 views
12

Hier ist, was ich erwartet hatte, eine völlig einfache Frage, aber ich kann keine endgültige Antwort in den Leitfäden oder anderswo finden.Rails 3 Validierung: Präsenz => falsch

Ich habe zwei Attribute auf einem ActiveRecord. Ich möchte, dass genau einer anwesend ist und der andere null oder ein leerer String ist.

Wie mache ich das Äquivalent von: Präsenz => falsch? Ich möchte sicherstellen, dass der Wert Null ist.

validates :first_attribute, :presence => true, :if => "second_attribute.blank?" 
validates :second_attribute, :presence => true, :if => "first_attribute.blank?" 
# The two lines below fail because 'false' is an invalid option 
validates :first_attribute, :presence => false, :if => "!second_attribute.blank?" 
validates :second_attribute, :presence => false, :if => "!first_attribute.blank?" 

Oder vielleicht ist es eine elegantere Möglichkeit, dies zu tun ...

Ich bin mit Rails 3.0.9

+0

Ich bin nicht sicher, was Sie brauchen die: Präsenz => überhaupt falsch in den letzten beiden Zeilen Code . – creativetechnologist

+0

@creativetechnologist Es braucht einen Test von irgendeiner Art. Wenn ich die Validität für die Anwesenheit loslasse, gibt es mir: C: /Ruby192/lib/ruby/gems/1.9.1/gems/activemodel-3. 0.9/lib/active_model/validations/validates.rb: 79: in 'validates ': Sie müssen mindestens eine Validierung liefern (ArgumentError) – LikeMaBell

+6

Bemerkenswert für Rails 4, dass dies' validates_absence_of' heißt. – mpowered

Antwort

8
class NoPresenceValidator < ActiveModel::EachValidator                                       
    def validate_each(record, attribute, value)         
    record.errors[attribute] << (options[:message] || 'must be blank') unless record.send(attribute).blank? 
    end                   
end  

validates :first_attribute, :presence => true, :if => "second_attribute.blank?" 
validates :second_attribute, :presence => true, :if => "first_attribute.blank?" 

validates :first_attribute, :no_presence => true, :if => "!second_attribute.blank?" 
validates :second_attribute, :no_presence => true, :if => "!first_attribute.blank?" 
0

Versuchen:

validates :first_attribute, :presence => {:if => second_attribute.blank?} 
validates :second_attribute, :presence => {:if => (first_attribute.blank? && second_attribute.blank?)} 

Hoffnung, die helfen.

1

Es sieht so aus: Länge => {: ist => 0} funktioniert für das, was ich brauche.

validates :first_attribute, :length => {:is => 0 }, :unless => "second_attribute.blank?" 
+1

Dies hat die Fehlermeldung "ist die falsche Länge (sollte 0 Zeichen sein)". Kann eine benutzerdefinierte Nachricht "muss leer sein" hinzufügen. 'validates: first_attribute,: length => {: ist => 0,: message =>" muss leer sein "},: es sei denn =>" second_attribute.blank? "' – tfentonz

3

benutzerdefinierte Validierung verwenden.

validate :validate_method 

# validate if which one required other should be blank 
def validate_method 
    errors.add(:field, :blank) if condition 
end 
23

ein Objekt zu ermöglichen, ihre Gültigkeit, wenn und nur dann, wenn ein bestimmtes Attribut Null ist, Sie „Aufnahme“, anstatt die Erstellung Ihre eigene Methode verwenden können.

validates :name, inclusion: { in: [nil] } 

Dies ist für Rails 3. The Rails 4 Lösung ist viel eleganter:

validates :name, absence: true 
Verwandte Themen