2013-10-03 71 views
2

我試圖在.each循環內使用HAML生成以下代碼。根據循環中的真/假條件,它應該在div1之前創建一個新的div1,其中div2或追加div2。這是邏輯的簡化:處理HAML縮進?

Desired output: 

if true, append `div2` within `div1`, 

    <div class="div1"> #added by true condition 
     div1 text 
     <div class="div2"> #added by true condition 
     div2 text 
     </div> 
     <div class="div2"> #added by false condition 
     div2 text 
     </div> 
     <div class="div2"> #added by false condition 
     div2 text 
     </div> 
    </div> 

else, create a new `div1` and add `div2` within it 

    <div class="div1"> #added by true condition 
     div1 text 
     <div class="div2"> #added by true condition 
     div2 text 
     </div> 
    </div> 
    <div class="div1"> #new div1, added by true condition 
     div1 text 
     <div class="div2"> #added by true condition 
     div2 text 
     </div> 
    </div> 

實際上,我試圖做到這一點

//within a loop logic 
    - if condition == true 
     .div1 
     div1 text 
    -# in all conditions 
     .div2 
      div2 text 

這是我HAML邏輯,我用tab_up但我不認爲這是正確的HAML方法:

//within a loop logic 
    - if condition == true 
     .div1 
     div1 text 
    - tab_up(2) #trying to indent the HAML, not just the HTML output 
    .div2 
     div2 text 
+2

你是什麼意思的「編程生成」?爲了'div2'在'div1'裏面,它需要比'div1'更多的在Haml源文件中縮進。 'tab_up'只是控制輸出外觀,不影響結構。你需要提供一個你想要做什麼的例子。 – matt

+0

問題不明確。你排除的解決方案顯然是正確的。 – depa

+0

非常感謝matt&depa,我試着清除一些。 – Dean

回答

0

在Haml中做這樣的事情的方法是在綁定之前組織數據以將其轉換爲HTML。 Enumerable的方法可以在這裏幫助。

您描述問題的方式,用slice_before拆分您的枚舉看起來是最直接的解決方案 - 您想在條件爲真的每個項目之前打開一個新的div1(這裏我假設條件取決於在項目上)。也許是這樣的:

- items.slice_before {|item| determine_condition(item) }.each do |div1_block| 
    .div1 
    div1 text 
    - div1_block.each do |item| 
     .div2 
     div2 text 

取決於你實際上試圖做的,有可能是一個更好的方式來組織你的數據 - 在這裏描述建議你看它在一個較低的水平的方式因爲您已經在按照迭代和創建HTML的方式思考問題了。

基本的想法是獲得數組的數組(或Enumerator),每個數組的內部數組表示div1的內容。 Haml很容易掉出來。 chunk,each_slicegroup_by是一些可能值得關注的Enumerable方法。

+0

謝謝馬特。不幸的是,由於其他要求,模型不能事先分組。它按照正確的順序排列。 – Dean