2013-10-06 12 views
24

Ho una visione comune che elenca due modelli diversi. L'unica differenza è che quando si imposta l'azione link_to, uno dei modelli ha un attributo link e l'altro no. Voglio verificare se esiste l'attributo link, e se lo fa, controlla se è impostato. Ho il seguente che funziona, ma mi chiedevo se ci fosse un modo migliore.Qual è il modo migliore per verificare se un attributo esiste ed è impostato?

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

risposta

26

Si potrebbe utilizzare presence:

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

O, se @element potrebbero non avere link a tutti, è possibile utilizzare try:

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

Provare a utilizzare l'hash degli attributi. Questo hash restituirà una mappatura key => value di tutti gli attributi di un oggetto activerecord.

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

meglio ancora: '@ element.attributes.key? ('Link')' – rickyrickyrice

12

io credo che si possa fare solo @element.attribute? (es. @element.link?) (suppongo che potremmo chiamarlo "attributi magici")

Questo controlla per

  • l'attributo esistenti sul modello
  • il valore non sia nullo

esattamente quello che vuoi.

+1

Questa è sicuramente la migliore risposta IMO. Chiaro e conciso. –

Problemi correlati