Rails 便利なテクニック その1

日常コード書いてて便利だなぁと思った技とかを思い出したら不定期に書いていきます。

よくメニューをulとliを使ってタブで表示することがあると思います。
例えばタブは以下の条件で表示されます

  • ユーザの年齢が20歳以上なら表示するタブA
  • ユーザの性別が男性なら表示するタブB
  • ユーザの性別が女性なら表示するタブC
  • ユーザの性別が男性でかつ20歳以上なら表示するタブD

実装が終わって総合テストがはじまります。

ここでチケットがあがってきます。

『タブが一つしか出力されない場合はタブを非表示にしてください。』

さてどうしましょう?

複雑なif文を組み合わせてタブが1つかでない条件を見つけ出して非表示にしますか?
タブが増えたり条件が増えたりしたら大変な上に可読性悪そうですね。

Railsには便利なcaptureというメソッドがあります。
これはcaptureメソッドに与えられたブロックの出力内容を返すメソッドです。
これを使うとシンプルに問題を解決できます。

app/views/layout/tab.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<% tab = capture do %>
  <ul>
    <% if user.age >= 20 %> 
      <li>タブA</li>
    <% end %>

    <% if user.male? %> 
      <li>タブB</li>
    <% end %>

    <% if user.female? %> 
      <li>タブC</li>
    <% end %>

    <% if user.male? && user.age >= 20 %> 
      <li>タブD</li>
    <% end %>
  </ul>
<% end %>

<% # tabが一個ならば表示しない %>
<%= tab.scan("</li>").count > 1 ? tab : "" %>

htmlを動的に組み立てる際にあれこれするよりも、出力されたhtmlをもとに処理するというケースの方が圧倒的にスマートなケースがあるので積極的に使っていきたいですね。

Comments