Rails
HTML5
actionview
tag
Refactoring

Rails 5.1 からは tag(:br) より tag.br を推奨

  • tag(:br) の書き方は、将来のバージョンのRailsで廃止予定だそうです
  • Rails 5.1 から tag.br 形式で書いた方がよいようです
  • その方法は Nokogiri::HTML::Builder を使う方法に似ています
  • tag.br と書くと <br> が生成されて <br /> にならないのはダメなんじゃ? と思いましたが HTML5 だとどっちでもいいようです
  • tag メソッドと、tag インスタンスが共存しているような違和感がありましたが、tag メソッドに引数がないと TagBuilder.new を返す仕組みでした
使用例
require "action_view"
include ActionView::Helpers::TagHelper
singleton_class.class_eval { attr_accessor :output_buffer }

tag(:br)                          # => "<br />"
tag.br                            # => "<br>"
tag.p                             # => "<p></p>"
tag.p class: "a"                  # => "<p class=\"a\"></p>"
tag.p "content", class: "a"       # => "<p class=\"a\">content</p>"
tag.p(class: "a") { "content" }   # => "<p class=\"a\">content</p>"
tag.xxx                           # => "<xxx></xxx>"

content_tag の方はレガシーではありませんが tag で書く方が簡潔です。
HTMLの予約語を内部で把握しているので br と違って p だと閉じタグを生成してくれます。
HTMLタグに応じてtag と content_tag の使い分けをしなくていいのがほんま楽です。

content_tag(:p, "xxx")            # => "<p>xxx</p>"
tag.p "xxx"                       # => "<p>xxx</p>"

class だけを指定したい場合も tag の方が自然1に書けます。

content_tag(:div, "", class: "a") # => "<div class=\"a\"></div>"
tag.div class: "a"                # => "<div class=\"a\"></div>"

content_tag だとこう書いてしまってなんじゃこれってなる罠があるので、この点でも tag の方が使いやすいように思います。

content_tag(:div, class: "a")     # => "<div>{:class=&gt;&quot;a&quot;}</div>"

参照

The following format is for legacy syntax support. It will be deprecated in future versions of Rails. https://github.com/rails/rails/blob/9c35bf2a6a27431c6aa283db781c19f61c5155be/actionview/lib/action_view/helpers/tag_helper.rb#L193

<br /> じゃなくて <br> だよ
http://qiita.com/irxground/items/dc3e688d7d48c01c3988

RailsでのHTML生成は、Nokogiri::HTML::Builderを使えばキレイに書ける(かも)
http://qiita.com/EastResident/items/140fafe234c7ee011391


  1. slim で書いた方がもっと自然ですが