2013-10-06 44 views
24

Mam wspólny widok, który zawiera dwa różne modele. Jedyna różnica polega na tym, że podczas ustawiania akcji link_to jeden z modeli ma atrybut link, a drugi nie. Chcę sprawdzić, czy istnieje atrybut link, a jeśli tak, sprawdź, czy jest ustawiony. Mam następujące, które działa, ale zastanawiałem się, czy istnieje lepszy sposób.Jaki jest najlepszy sposób sprawdzenia, czy atrybut istnieje i czy jest ustawiony?

%li 
    - if @element.has_attribute?("link") && @element.link 
    = link_to @element.title, @element.link 
    - else 
    = link_to @element.title, @element 

Odpowiedz

26

Można użyć presence:

= link_to @element.title, (@element.link.presence || @element) 

Lub, jeśli @element może nie mieć link w ogóle można użyć try:

= link_to @element.title, (@element.try(:link) || @element) 
5

Spróbuj użyć skrótu atrybutów. Ten skrót spowoduje odwzorowanie wszystkich atrybutów obiektu aktywnego rekordu na key => value.

if @element.attributes['link'] 
    # Here we are 
else 
    # default 
end 
+6

jeszcze lepiej: '@ element.attributes.key? ('Link')' – rickyrickyrice

12

Wierzę, że można po prostu zrobić @element.attribute? (np. @element.link?) (Przypuszczam, że moglibyśmy nazwać to "magicznymi atrybutami").

ta sprawdza

  • atrybut istniejące od modelu
  • wartość nie jest zerowa

dokładnie, co chcesz.

+1

To zdecydowanie najlepsza odpowiedź IMO. Jasne i zwięzłe. –