LoginSignup
5
8

Rails - content_tagでビューヘルパーを自作する。

Last updated at Posted at 2015-07-02

経緯

ActionViewのヘルパーメソッドについて勉強していたら、 ActionView::Helpers::TagHelperクラスのcontent_tagメソッドを用いて、ビューヘルパーを自作できることが分かりました。
そこで今後も繰り返し使えそうなkey−valueペアの表を生成するメソッドを作ることにしました。

Screenshot 2015-07-02 16.49.50.png

実はもうちょっと複雑な表を作ろうと思ったのですが、入れ子構造が深くなるとうまくできませんでした。悩むくらいならpartialを作った方が早そうです。

#手順
####1. /app/helpers/配下のファイルでメソッドを自作。
以下の例ではkv_table_forメソッドを定義します。便宜上BootstrapのCSSクラスが加えてあります。

/app/helpers/application_helper.rb

module ApplicationHelper

  # kv_names:   配列 [key名, value名]
  # collection: hash { key1: value1, key2: value2, ... }
  def kv_table_for(kv_names, collection={})
    thead = content_tag(:thead) do
      content_tag(:tr) do
        tags = kv_names.map { |column| content_tag(:th, column, class: "text-center") }
        safe_join tags
      end
    end

    tbody = content_tag(:tbody) do
      tags = collection.map do |k, v|
        content_tag(:tr, class: "text-center") do
          concat content_tag(:td, k)
          concat content_tag(:td, v)
        end
      end
      safe_join tags
    end

    content_tag(:div, class: "table-responsive") do
      content_tag(:table, class: "table table-bordered table-hover table-striped") do
        thead + tbody
      end
    end
  end
end

####2. データを渡し、テンプレートから呼ぶ。
テンプレートはHAMLで書いています。
これで今後は、一行のみで同様の表を作成することができます。

show.html.haml
= kv_table_for %w(category volume), @items.group(:category).sum(:volume)

誰かが作った便利なGems

当然ながらこういうメソッドを自作しなくても、既に誰かが便利なGemを作っています。

しかしながら、これらは全然メンテナンスされてない様子なので、やっぱり、自分でわかる範囲で都度やった方が無難そうです。

#考察
Railsにはpartial等便利な選択肢が多数ありますので、あえてビューヘルパーを自作する機会は少ないように思われます。しかしながら、いつも同じ書式でデータを変更するのみの部品があれば、ビューヘルパーを自作することにより、link_to等の様に便利に使い回しができそうです。通常のHTMLと比較して直感的に読みにくいので、複雑な構造には向いていない様に思われます。

#参考資料

5
8
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
8