haml内のrubyコード

blogのインデックスページとかで、新着5件とかをforで回して表示する時、それぞれの記事にidを振ったりとかしたい。


先にまとめ

  • 先頭に - がある行はrubyスクリプトとして評価される
  • tagの後に = があると、それ以降はrubyスクリプトとして評価される。
  • tagのattributeとしてhashで渡す部分は、hashの値をダブルクオートして#{rubyスクリプト}として渡すとid連番を実現できる(blogentry、entrytitleの部分)
  • 先頭に = つけた行で、その後にダブルクオート付けて中に#{}でrubyとして評価させられる。
  • 先頭に = が無くても、#{}で囲んだ中はrubyとして実行される。ダブルクオートで囲む必要は無い。(投稿日時の部分)ただしtagのattributeの引数のhash以外の場所で有効。


こう書くと

!!! XML

%html
  %head
    %title testpage
  %body
    %h1 test
    %a{:href => 'http://shokai.org'} shokai.org
    %br
    .description
      あいうえお
      かきくけこ
    - for i in 1..3 do
      %div.blogentry{:id => "entry_#{i}"}
        %span.entrytitle{:id => "title_#{i}"} 記事#{i}
        %div.entrybody
          投稿日時:#{Time.now}
          = "記事の内容#{i}"


こうなる

<?xml version='1.0' encoding='utf-8' ?>
<html>
  <head>
    <title>testpage</title>
  </head>
  <body>
    <h1>test</h1>
    <a href='http://shokai.org'>shokai.org</a>
    <br />
    <div class='description'>
      あいうえお
      かきくけこ
    </div>
    <div class='blogentry' id='entry_1'>
      <span class='entrytitle' id='title_1'>記事1</span>
      <div class='entrybody'>
        投稿日時:Sun Dec 12 21:49:01 +0900 2010
        記事の内容1
      </div>
    </div>
    <div class='blogentry' id='entry_2'>
      <span class='entrytitle' id='title_2'>記事2</span>
      <div class='entrybody'>
        投稿日時:Sun Dec 12 21:49:01 +0900 2010
        記事の内容2
      </div>
    </div>
    <div class='blogentry' id='entry_3'>
      <span class='entrytitle' id='title_3'>記事3</span>
      <div class='entrybody'>
        投稿日時:Sun Dec 12 21:49:01 +0900 2010
        記事の内容3
      </div>
    </div>
  </body>
</html>