21st
Sat
遅延条件ブロックで複雑な条件節を簡潔にする
UL/LIタグを使ってリストを表示するときに、 コレクションが空の場合はULタグを表示したくない場合というのが頻繁にあります。
1 <% if @posts.present? %> 2 <ul> 3 <% @posts.each do |post| %> 4 <li><%= h(@post.body) %></li> 5 <% end %> 6 </ul> 7 <% end %>
そういう時は、だいたいこんな感じにコードを書きます。 しかし、条件が複雑になってきたり、複数のコレクションを考えなければ行けない場合に、きれいに記述出来なくなってきます。 そんな時は、以下のようなヘルパを使って、分岐条件を遅延評価するようにすると、処理が簡潔になります。
1 module ApplicationHelper 2 def delayed_if (&block) 3 flag = Object.new 4 def flag.set; @value = true end 5 def flag.reset ; @value = false end 6 result = capture(&proc{block.call(flag)}) 7 concat(result) if flag.instance_v ariable_ge t(:@value) 8 end
利用法
1 <% delayed_ifdo |flag| %> 2 <ul> 3 <% @posts.each do |post| %> 4 <li><%= h(@post.body) %></li> 5 <% flag.set %> 6 <% end %> 7 </ul> 8 <% end %>
flag.setがよばれた時だけ、delayed_if
posted by
genki
on Sat 21 Mar 2009
at 22:45