2011-08-29 7 views
29

Come posso utilizzare una condizione per decidere se generare un tag circostante in HAML? Sto cercando di creare la versione DRY del codice qui sotto.Come posso avvolgere condizionatamente alcuni contenuti HAML in un tag?

- if i_should_link 
    %a{:href => url} 
    .foo 
    .block 
     .of 
     .code 
- else 
    .foo 
    .block 
     .of 
     .code 
+0

Non sono sicuro di come sia correlato all'HTML se è HAML ... – element119

+0

Questo è un duplicato di: http://stackoverflow.com/questions/8636401/haml-create-container-element-only- if-condition-is-true –

risposta

28

È possibile utilizzare un parziale.

foo.html.haml

- if i_should_link 
    %a{:href => url} 
    = render 'bar' 
- else 
    = render 'bar' 

_bar.html.haml

.foo 
    .block 
    .of 
     .code 

Edit: Oppure si potrebbe utilizzare il contenuto per, credo che questo è meglio perché mantiene tutto nello stesso file.

+1

l'approccio content_for è abbastanza buono. grazie, odin. vedrò se arrivano altre soluzioni e ti faccio sapere. –

+7

..e lui non me lo fa sapere :-( – twe4ked

+3

ricordandoti che non hai ancora avuto risposta. Puoi dormire: D? – Ven

21

Penso che il suggerimento di Odin di utilizzare un parziale sia probabilmente il migliore nella maggior parte delle situazioni.

Tuttavia, come una soluzione alternativa, ho trovato a thread dove Nathan Weizenbaum ha suggerito la definizione di questo metodo:

def haml_tag_if(condition, *args, &block) 
    if condition 
    haml_tag *args, &block 
    else 
    yield 
    end 
end 

Qualunque sia nel blocco sarebbe sempre essere resa, ma il tag involucro apparirebbero o meno in base alla condizione.

Si potrebbe usare come segue:

- haml_tag_if(planning_to_mail?, :div, :id => 'envelope') do 
    %p I'm a letter 

Se planning_to_mail? viene valutata true, si otterrebbe:

<div id="envelope"> 
    <p>I'm a letter</p> 
</div> 

Se si valuta false, si otterrebbe:

<p>I'm a letter</p> 

Ha lanciato l'idea di aggiungere questo a Haml::Helpers, ma quello doesn't appear to have happened yet.

+7

Questo è stato recentemente aggiunto ad Haml, ma non è ancora in una release. Cercalo in Haml 4.1 o Haml 5: https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1 – matt

+0

Questa è una risposta fantastica - sei anni e offre ancora un'ottima soluzione. Per quello che vale, ho sostituito haml_tag con content_tag nell'helper e funziona come descritto sopra. – SRack

Problemi correlati