2011-08-29 9 views
29

HAML'de çevreleyen bir etiket çıktısına karar vermek için bir koşulu nasıl kullanabilirim? Aşağıdaki kodun DRY sürümünü oluşturmaya çalışıyorum.Bazı HAML içeriğini bir etikette nasıl koşullu olarak sarmalıyım?

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

HAML ... – element119

+0

ise bunun HTML ile ilgili olduğundan emin değilim. Bu bir kopyasıdır: http://stackoverflow.com/questions/8636401/haml-create-container-element-only- if-condition-is-true –

cevap

28

Kısmi kullanabilirsiniz.

foo.html.haml

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

_bar.html.haml

.foo 
    .block 
    .of 
     .code 

Düzenleme: Yoksa için içerik kullanabilirsiniz, bu onun yüzünden daha iyi olduğunu tahmin hepsini aynı dosyada tutar.

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

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

content_for yaklaşımı oldukça iyi. sağol, odin. Başka herhangi bir çözümün gelip gelmediğini anlayacağım. –

+7

.. ve asla bana bildirmeme izin vermez :-( – twe4ked

+3

Hala cevap vermediğinizi hatırlatıyor Uyuyabiliyor musunuz: D? – Ven

21

Bence odin'in kısmi kullanımı önerisi, çoğu durumda muhtemelen en iyisidir.

Ancak alternatif bir çözüm olarak, Nathan Weizenbaum bu yöntemi tanımlayan önerdi nerede a thread bulundu: blokta ne olursa olsun

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

daima hale edilecek olmasına karşın sarma etiket bazlı görünür veya olmaz şartıyla. aşağıdaki gibi

Bunu kullanmak: planning_to_mail?true değerlendirir

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

varsa, almak istiyorum:

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

o false değerlendirir ise, elde ederdiniz:

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

'a ekleme fikrini süzdü., ancak bu doesn't appear to have happened yet.

+7

Bu son zamanlarda Haml'a eklenmiştir, ancak henüz bir sürümde değildir. Haml 4.1 veya Haml 5'te dikkat edin: https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1 – matt

+0

Bu harika bir cevap - altı yıl ve hala harika bir çözüm sunuyor.İnanan şey için, haml_tag yerine content_tag ile değiştirdim ve yukarıda belirtildiği gibi çalışır. – SRack