たとえばこういうテーブルがあるとしましょうよ。
項目 | 内容 |
---|---|
都道府県 | 東京都 |
市町村 | 北区 |
郵便番号 | 11x-xxxx |
モバイル | example@trick-with.net |
PC | hogehoge@trick-with.net |
姓 | 大久保 |
名 | 康平 |
でね、あるデータでは、PCアドレスが無かったり、市町村が未入力だったりするとします。そういうときは、空の枠を残さずに、以下のようにしたい、としましょう。(俗に言うトルツメ)
項目 | 内容 |
---|---|
都道府県 | 東京都 |
郵便番号 | 11x-xxxx |
モバイル | example@trick-with.net |
姓 | 大久保 |
名 | 康平 |
別のある人は、モバイルアドレスと苗字しか教えてくれませんでした。この場合は、名の行は空で表示したい、としましょう。
項目 | 内容 |
---|---|
モバイル | example@trick-with.net |
姓 | 大久保 |
名 |
姓も名もなければこうなる、としましょう。
項目 | 内容 |
---|---|
モバイル | example@trick-with.net |
で、もし何も入力されない場合には、テーブルごとトルツメしたいわけです。 |
というようなことを Rails で綺麗に実現できまいか、と考えたのがこれ。
ruby
module ApplicationHelper
def omit(val = nil, &block)
unless block_given?
raise 'no parent block' if @_omit.empty?
@_omit[-1] = false unless val.nil?
return val
end
raise "Don't pass a value with block" if val
@_omit ||= []
@_omit.push true
ret = capture(&block)
return nil if @_omit.pop
@_omit[-1] = false unless @_omit.empty?
ret
end
end
使い方はこんなん。
omit do ブロック内に omit(value) を並べ、 nil でない value が1つでも存在すれば、ブロック全体を表示、なければブロック全体をトルツメする。
omit をネスト出来るようにするのにけっこう頑張った。
= omit do
%table
%tr
%th 小分類
%th 内容
= omit do
%tr
%th 都道府県
%td= omit user.prefecture
= omit do
%tr
%th 市町村
%td= omit user.city
= omit do
%tr
%th 郵便番号
%td= omit user.zip_code
= omit do
%tr
%th モバイル
%td= omit user.email_mobile
= omit do
%tr
%th PC
%td= omit user.email_pc
= omit do
%tr
%th 姓
%td= omit user.family_name
%tr
%th 名
%td= omit user.given_name
空文字 ""
を無視したい場合は、omit hoge.presence
とすればOK.
もし omit メソッドを気に入ってくれて頻繁に使うなら、メソッド名を _
とかにしちゃえば?
rspec も書いといた。 https://gist.github.com/kuboon/6b3084e1b87adb9f8fd3#file-application_helper_spec-rb