2011-08-29 27 views
29

¿Cómo puedo usar una condición para decidir si mostrar una etiqueta circundante en HAML? Estoy tratando de crear la versión DRY del código a continuación.¿Cómo puedo envolver condicionalmente algunos contenidos HAML en una etiqueta?

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

No estoy muy seguro de cómo esto se relaciona a HTML si es HAML ... – element119

+0

Este es un duplicado de: http://stackoverflow.com/questions/8636401/haml-create-container-element-only- if-condition-is-true –

Respuesta

28

Puede usar un parcial.

foo.html.haml

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

_bar.html.haml

.foo 
    .block 
    .of 
     .code 

Editar: O usted podría utilizar el contenido para, supongo que esto es mejor porque lo mantiene todo en el mismo archivo.

- if i_should_link 
    %a{:href => url} 
    = yield :foobar 
- else 
    = yield :foobar 

- content_for :foobar do 
    .foo 
    .block 
     .of 
     .code 
+1

el enfoque de content_for es bastante bueno. gracias, odin. Veré si otras soluciones entran y se lo hago saber. –

+7

.. y él nunca me dejó saber :-( – twe4ked

+3

recordándole que todavía no ha tenido respuesta. ¿Puede dormir: D? – Ven

21

Creo que la sugerencia de Odin de utilizar un parcial es probablemente la mejor en la mayoría de las situaciones.

Sin embargo, como una solución alternativa, encontré a thread donde Nathan Weizenbaum sugirió definir este método:

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

lo que está en el bloque habría siempre ser prestados, pero la etiqueta de envoltura gustaría aparecer o no en base bajo la condición.

Se podría utilizar la siguiente manera:

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

Si planning_to_mail? evalúa true, se obtendría:

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

Si se evalúa false, se obtendría:

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

Flotó la idea de agregar esto a Haml::Helpers, pero eso doesn't appear to have happened yet.

+7

Esto se ha agregado recientemente a Haml, pero aún no está en un lanzamiento. Esté atento a él en Haml 4.1 o Haml 5: https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1 – matt

+0

Esta es una respuesta fantástica, seis años después y sigue ofreciendo una excelente solución. Para lo que sea, he reemplazado haml_tag con content_tag en el asistente y funciona tal como se describe anteriormente. – SRack

Cuestiones relacionadas