search
LoginSignup
4

More than 5 years have passed since last update.

posted at

updated at

Organization

erb, haml のトルツメ

たとえばこういうテーブルがあるとしましょうよ。

項目 内容
都道府県 東京都
市町村 北区
郵便番号 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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4