cycleヘルパーを使ってテーブルをストライプにする

けっこう昔からあるのに割と最近知ったRailsの便利ヘルパー。
書式は以下の通り。

cycle(first_value, *values)

呼び出されるたびに与えられた順番に引数の文字列を出力する。

テーブルをストライプにするためにのコード例

まずはcycleを使わないで書いたコード。

<table>
  <% @items.each_with_index do |item, i| %>
    <% if i % 2 == 0 %>
    <tr style="background-color:#fff;">
    <% else %>
    <tr style="background-color:#ccf;">
    <% end %>
      <td><%= item.name -%></td>
    </tr>
  <% end %>
</table>

これがcycleを使うと次のように簡単に書ける。

<table>
  <% @items.each do |item| %>
  <tr style="background-color:<%= cycle("#fff", "#ccf") -%>;">
    <td><%= item.name -%></td>
  </tr>
  <% end %>
</table>

応用

  • 引数の数は2つに限らない。例えば4つ引数を与えるとその4つを順番にサイクルする。
  • 引数に「:name => ‘hogehoge’」とハッシュを与えることでサイクルに名前をつけることができる。
  • 特に :name を指定しないサイクルの名前は “default”
  • reset_cycle(name) でnameと名付けられているサイクルをリセットすることができる。引数省略すると “default” をリセット。

以下サンプルコード。
要素10個表示ごとにテーブルを分けてreset_cycle。

まあ、こんな変なストライプはまずしないけどサンプルと言うことで。

<table>
  <% @items.each_with_index do |item, i| %>
  <tr style="background-color:<%= cycle("#fff", "#ccf", "#cfc", "#fcc", :name => 'sample') -%>;">
    <td><%= item.name -%></td>
  </tr>
  <% if i % 9 == 0%>
  </table>
  <hr />
  <table>

  <% reset_cycle('sample') %>
  <% end %>
  <% end %>
</table>

なんかRails触り始めてそろそろ2年になると言うのに知らんことが多すぎるのでRails再勉強中。
恥をさらすようでもあるが、アウトプットするために書くことはとてもよい勉強になるので書く。

参考

Module ActionView::Helpers::TextHelper