Edited at

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

More than 1 year has passed since last update.



  • 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 で書いた方がもっと自然ですが