2

ループ内で HAML を使用して次のコードを生成しようとしてい.eachます。ループ内の true/false 条件に応じて、 a を使用して新しいdiv1を作成するか、前の 内にdiv2追加する必要があります。これはロジックを単純化したものです。div2div1

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
4

1 に答える 1

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ます。その後、ハムルはかなり簡単に脱落します。chunkeach_sliceおよび検討する価値のあるgroup_byいくつかの方法があります。Enumerable

于 2013-10-04T11:55:41.250 に答える