2013-12-16 12 views
5

Próbuję sprawdzić wiele atrybutów dla zer, znalazłem ten post simplify..., ale nie otrzymuję wyników, których chcę. Mam użytkownika, który w razie potrzeby chcę zaktualizować jego profil. Ten użytkownik ma jednak wszystkie potrzebne dane.Ruby na szynach, wielokrotne sprawdzanie zerowych atrybutów

@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 

Dlaczego odpowiada tutaj true, gdy wszystkie inne pojedyncze próby prób odpowiadają fałszywie?

Odpowiedz

9

Jesteś łańcuchowym .try(), który nie po try(:age_id):

  • Próbuje zadzwonić age_id na obiekcie @user
  • jeśli @user.nil? # => zwraca nil
  • razie @user.age_id != nil # => powroty a Fixnum
  • Następnie wywołuje się metodę try(:customer) na Fixnum, który oczywiście nie powiedzie się # => retur ns nil

itp

Przykładem z konsoli IRB:

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

Jeśli chcesz przetestować, że wszystkie te atrybuty nie są zerowe, użyj tego:

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

Inną opcją jest "% w (kraj klienta age_id) .all? {| attr | @user [attr] .present? } ' –

Powiązane problemy