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_variable_get(:@value)
   8    end

利用法

   1  <% delayed_if do |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のブロックが表示されます。 この例だと単純すぎてあまり恩恵が分かりにくいですが、 複数のコレクションを一つのULで表示する場合などでも簡潔に記述出来るようになります。

posted by Png genki on Sat 21 Mar 2009 at 22:45

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry1372
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ