2011-08-29 9 views
29

Jak mogę użyć warunku, aby zdecydować, czy wydrukować otaczający tag w HAML? Próbuję utworzyć wersję DRY kodu poniżej.Jak mogę warunkowo zawijać niektóre elementy HAML w tagu?

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

Nie jestem do końca pewien, jak to jest związane z HTML, jeśli jest to HAML ... – element119

+0

To jest duplikat: http://stackoverflow.com/questions/8636401/haml-create-container-element-only- jeśli-warunek-jest-prawdziwy –

Odpowiedz

28

Można użyć częściowego.

foo.html.haml

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

_bar.html.haml

.foo 
    .block 
    .of 
     .code 

Edit: Albo można użyć do treści, to chyba lepiej, bo zachowuje wszystko w tym samym pliku.

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

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

content_for podejście jest całkiem dobre. dzięki, odin. Zobaczę, czy pojawią się jakieś inne rozwiązania i dam ci znać. –

+7

..i nigdy nie dali mi znać :-( – twe4ked

+3

przypominając, że nadal nie masz odpowiedzi, czy możesz spać: D? – Ven

21

Myślę, że sugestia odina, aby użyć częściowego, jest prawdopodobnie najlepsza w większości sytuacji.

Jednakże, jako rozwiązanie alternatywne, stwierdziliśmy a thread gdzie Nathan Weizenbaum sugeruje definiowaniu tego sposobu:

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

co jest w blok, który zawsze renderowany, a znacznik owijania będzie się lub nie opiera pod warunkiem.

by go użyć w następujący sposób:

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

Jeśli planning_to_mail? ocenia true, można uzyskać:

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

Jeśli ocenia false, można uzyskać:

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

Przedstawił pomysł dodania tego do Haml::Helpers, ale to doesn't appear to have happened yet.

+7

Zostało to ostatnio dodane do Hamla, ale nie jest jeszcze dostępne w wersji Haml 4.1 lub Haml 5: https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1 – matt

+0

To jest fantastyczna odpowiedź - już po sześciu latach i wciąż oferuje świetne rozwiązanie, bo to, co jest warte, zastąpiłem haml_tag tagiem content_tag w programie pomocniczym i działa tak, jak opisano powyżej. – SRack