2013-12-16 5 views
5

Ich versuche, mehrere Attribute für Null zu überprüfen, ich habe diesen Beitrag simplify... gefunden, aber ich bekomme nicht die Ergebnisse, die ich will. Ich habe einen Benutzer, den ich bei Bedarf ihr Profil aktualisieren möchte. Dieser Benutzer hat jedoch alle Daten, die ich möchte.Ruby auf Schienen, mehrfache Prüfung auf Null-Attribute

@user.try(:age_id).nil? 
    #returns false 
    @user.try(:customer).nil? 
    #returns false 
    @user.try(:country).nil? 
    #returns false 

    @user.try(:age_id).try(:customer).try(:country).nil? 
    #returns true 

Warum reagiert es mit wahr hier, wenn alle anderen einzelnen Instanzen von Versuchen mit false reagiert?

Antwort

9

Du Verkettungs die .try(), die nach dem Ausfall try(:age_id):

  • Es wird versucht age_id auf dem @user Objekt aufzurufen
  • wenn @user.nil? # =>nil
  • wenn @user.age_id != nil # => kehrt zurück a Fixnum
  • Dann rufen Sie die Methode try(:customer) auf eine Fixnum, die offensichtlich fehlschlägt # => zurück ns nil

usw.

Ein Beispiel aus der IRB-Konsole:

1.9.3p448 :049 > nil.try(:nothing).try(:whatever).try(:try_this_also).nil? 
=> true 

Wenn Sie testen möchten, dass alle diese Attribute nicht gleich Null sind, verwenden Sie diese:

if @user.present? 
    if @user.age_id.presence && @user.customer.presence && @user.country.presence 
    # they are all present (!= nil) 
    else 
    # there is at least one attribute missing 
    end 
end 
+14

Eine andere Option ist '% w (age_id customer country) .all? {| attr | @user [attr] .präsentieren? } ' –