Haml で閉じタグに悪戦苦闘してRails を学んだお話

Rails を使い始めてからたまにテンプレートでHaml を使う機会があるのですが、先日下記HTML のようなものを書きたいと思いました。

<div class="hoge">
  <div class="fuga">item1</div>
  <div class="fuga">item2</div>
</div>
<div class="hoge">
  <div class="fuga">item3</div>
  <div class="fuga">item4</div>
</div>

まずはERB に起こしてみました。

<% items.each_with_index do |item, index| %>
  <% if index % 2 == 0 %>
    <div class="hoge">
  <% end %>
  <div class="fuga"><%= item.to_s %></div>
  <% if index % 2 == 1 %>
    </div>
  <% end %>
<% end %>
<%# 凄い雑です、奇数で終わる場合とか無視です %>

しかしこれをHaml で書こうとすると途端に面倒なことになります。何しろインデントが命のHaml です。

- items.each_with_index do |item, index|
  - if index % 2 == 0
    .hoge
  # ...どうすればいいのん?(´・ω・`)

Haml を使ったことがある方はわかると思いますが、閉じタグが自動で入れられてしまいます。上記のif 文を閉じる時には同時に<div class="hoge"> も閉じられてしまいます。

ひとまず力技でやってみる

Haml で書けないならRails で書けばいいじゃない。ということでやってみました。

- items.each do |item|
  - if index % 2 == 0
    = "<div class='hoge'>".html_safe
  .fuga= item.to_s
  - if index % 2 == 1
    = "</div>".html_safe

動いたには動いたけど、格好悪い。

surround を発見し、使ってみた

調べてみたところ、HAML にsurround というメソッドがありました。これはこのメソッドのブロックの前後に任意の文字列を入れることが可能です。

- items.each_with_index do |item, index|
  = surround(index % 2 == 0 ? "<div class='hoge'>".html_safe : "", index % 2 == 1 ? "</div>".html_safe : "") do
    .fuga= item.to_s

出来た!しかも短い!でも大バカヤローでした。

いつからそのERB が最適だと錯覚していた?

社内で上記の話をしてみたところ、each_slice があるじゃないかと突っ込みをくらいました。ERB にすると下記の通りです。

<% items.each_slice(2) do |temp_items| %>
  <div class="hoge">
    <% temp_items.each do |item| %>
      <div class="fuga"><%= item.to_s %></div>
    <% end %>
  </div>
<% end %>

おぉ、これならHaml にも簡単に直せる!

- items.each_slice(2) do |temp_items|
  .hoge
    - temp_items.each do |item|
      .fuga= item.to_s

今度こそ出来た!しかもさっきより読みやすい!きっとこっちの方が良い解決案だと思います。

でもこれより更に良い解決方法はあるかもしれません、知ってる方はコメントください。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

shibuso

明治大学大学院理工学研究科を修了後ウェブ企業に就職。その後ソーシャルゲーム企業に転職し、後に登録会員数400万人を超えたタイトルのローンチを担当。2012年にBPSに入社。 Java, PHP, Perl, Rubyと渡り歩いて来ました。BPSに入社後RubyとRailsを使い始めましたが、今では一番好きな言語になっています。 休日の趣味はゲームと愛車のCBR250Rでのツーリングです。 たまにblog書いてます。http://www.shibuso.net

shibusoの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ