2011-08-29 12 views
29

एचएएमएल में आसपास के टैग को आउटपुट करना है या नहीं, यह तय करने के लिए मैं एक शर्त का उपयोग कैसे कर सकता हूं? मैं नीचे दिए गए कोड का DRY संस्करण बनाने की कोशिश कर रहा हूं।मैं टैग में कुछ HAML सामग्री को सशर्त रूप से कैसे लपेट सकता हूं?

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

मुझे सच में यकीन नहीं है कि यह एचटीएमएल से कैसे संबंधित है यदि यह हैएएमएल है ... – element119

+0

यह एक डुप्लिकेट है: http://stackoverflow.com/questions/8636401/haml-create-container-element-only- if-condition-is-true –

उत्तर

28

आप आंशिक उपयोग कर सकते हैं।

foo.html.haml

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

_bar.html.haml

.foo 
    .block 
    .of 
     .code 

संपादित करें: या आप के लिए सामग्री इस्तेमाल कर सकते हैं, मुझे लगता है इस वजह से यह बेहतर है इसे सभी एक ही फाइल में रखता है।

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

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

content_for दृष्टिकोण बहुत अच्छा है। धन्यवाद, ओडिन। मैं देखूंगा कि क्या कोई अन्य समाधान आ रहा है और आपको बताएगा। –

+7

.. और उसने मुझे कभी नहीं बताया :-( – twe4ked

+3

आपको याद दिलाता है कि आपके पास अभी भी कोई जवाब नहीं है। क्या आप सो सकते हैं: डी? – Ven

21

मुझे लगता है कि एक आंशिक उपयोग करने के लिए ओडिन के सुझाव शायद ज्यादातर स्थितियों में सबसे अच्छा है।

हालांकि, एक वैकल्पिक समाधान के रूप में, मैं a thread जहां नाथन Weizenbaum इस विधि को परिभाषित करने का सुझाव दिया पाया:

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

जो भी ब्लॉक में है हमेशा गाया किया जाएगा, लेकिन रैपिंग टैग आधारित प्रकट होता है या नहीं इस शर्त पर।

आप इस प्रकार के रूप में यह प्रयोग करेंगे: planning_to_mail? का मूल्यांकन करता है

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

तो true, आप चाहते हैं:

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

यह false का मूल्यांकन करता है, तो आप प्राप्त करेंगे:

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

उन्होंने इसेमें जोड़ने का विचार जारी किया, लेकिन doesn't appear to have happened yet

+7

इसे हाल ही में हैम्ल में जोड़ा गया है, लेकिन यह अभी तक रिलीज में नहीं है। इसके लिए हैमल 4.1 या हैमल 5 में देखें: https://github.com/haml/haml/commit/66a8ee080a9fb82907618227e88ce5c2c969e9d1 – matt

+0

यह एक शानदार जवाब है - छह साल और अभी भी एक अच्छा समाधान प्रदान करता है। इसके लिए क्या है, मैंने सहायक में सामग्री_टैग के साथ haml_tag को बदल दिया है और यह ऊपर उल्लिखित कार्य करता है। – SRack

संबंधित मुद्दे