3

商品のリストがあり、商品フィードに広告を表示したいと考えています。

私は次のようなものが欲しい:

<div id="container">
    <div id="product">Bla..</div>
    <div id="product">Bla..</div>
    <div id="product">Bla..</div>
</div>
<div id="add">
    Adsense Stuff
</div>
<div id="container">
    <div id="product">Bla..</div>
    <div id="product">Bla..</div>
    <div id="product">Bla..</div>
    <div id="product">Bla..</div>
    <div id="product">Bla..</div>
</div>

ERB では、次のようになります。

<div id="container">
    <% productes.each_with_index do |product,index| %>
         <div id="product"><%= product %></div>
         <% if index == 2 %>
            </div>
            <div id="add">
                Adsense Stuff
            </div>
            <div id="container">
         <% end %>
     <% end %>
</div>

これをHamlまたはSlimにどのように翻訳しますか?

ループを 2 つのループに分割したくない理由は 2 つあります。ページごとの商品数がわからないことと、Railscycle()ヘルパーで同じ HTML トリックを使用するさらに精巧なコードがいくつかあることです。だから、それを可能にするためのトリックを見つけることは私を大いに助けます.

4

4 に答える 4

2
- products.each_with_index do |product,index|
  .product
    = product
    - if index == 2
      .ad= Adsense Stuff

これはそれをするべきですか?

于 2012-01-17T12:08:50.477 に答える
2

HAMLで

-products.each_with_index do |product,index|
  .product= product
  -if index == 2
    .ad= Adsense Stuff

コンテナを気にする必要はありません。製品と広告のクラスを処理するようにcssを設定するだけです。(これは、同じ名前のIDが複数あるという事実も示していますが、これらはクラスに変更する必要があります)。

于 2012-01-17T11:15:47.203 に答える
2

Haml を使用すると、必要に応じて生の HTML を出力として記述できます。奇妙ではありますが、Erb で行ったように、これを使用してここで目標を達成できます。

TEMPLATE = '
.container
  - products.each_with_index do |product,index|
    - if index == 2
      </div>
      <div class="ad">AdSense Stuff</div>
      <div class="container">
    .product<
      = product
'

require 'haml'
products = %w[ cat box kitten shoes hounds ]
puts Haml::Engine.new(TEMPLATE).render binding

#=> <div class='container'>
#=>   <div class='product'>cat</div>
#=>   <div class='product'>box</div>
#=>   </div>
#=>   <div class="ad">AdSense Stuff</div>
#=>   <div class="container">
#=>   <div class='product'>kitten</div>
#=>   <div class='product'>shoes</div>
#=>   <div class='product'>hounds</div>
#=> </div>

くぼみは奇妙に見えますが、外側に AdSense のものを含む 2 つのコンテナがあることがわかります。

于 2012-01-21T06:26:43.740 に答える
2

surroundhelperを使用した可能な Haml ソリューション:

.container
  -products.each_with_index do |product,index|
    .product=product
    -if index == 2
      =surround "</div>", "<div class='container'>" do
        .add
          Adsense stuff

これは、コンテナー div を閉じたり開いたりすることを「偽造」しているという点で、ちょっとしたハックです。Haml が知る限り、私たちはまだその中にいます。このため、2 つの場所で「コンテナー」クラス (および div が持つ可能性のあるその他の属性) を指定する必要があるという点で、少し繰り返します。

このソリューションは@Phrogzのソリューションに似ていますが、これはもう少し「Haml-ly」であり、Haml構文を使用してadd divを定義できます。

于 2012-01-22T03:16:13.900 に答える