LoginSignup
5
4

More than 5 years have passed since last update.

erb, haml のトルツメ

Last updated at Posted at 2014-12-22

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

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

5
4
0

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
  3. You can use dark theme
What you can do with signing up
5
4