従来、Railsのビューでタグを書く場合に、tag
とcontent_tag
の2つを使っていましたが、Rails 5.1ではtag.br
のような新形式のメソッドが登場しています。
特徴
引数でなくメソッド形式でタグ名を与えるため簡潔になる、ということと、tag
とcontent_tag
を使い分けずに済む、という点があります。
ソースコードから仕組みを探る
まず、tag
メソッドを呼び出した際に、引数が一切なければtag_builder
メソッドを呼んで、内部実装であるTagBuilder
のインスタンスを生成します。
つまりh1
やp
などのメソッドは、このTagBuilder
のインスタンスメソッドということになります。とはいえ、全部作っては面倒なのでmethod_missing
の出番で、どんなメソッド名が来ても同じように処理していきます(tag.foo
のようなでたらめな名前を指定しても動いてしまいます)。
そして、開きタグと閉じタグがセットになったタグと、<input>
のような閉じタグなしで完結するものの2つがありますが、この区別は「中身の指定がないもの」かつ「既知のself-closingなタグ名にマッチするもの」だけが閉じタグなしで処理される流れになっていました。
すなわち、「JavaScriptをセットするための空の<div>
を用意したい」というような場合や、「src
を指定した<script>
を用意したい」など、開きタグ直後に閉じタグを作る用事でも、tag.div id: :hoge
のように書けて、空の中身である''
などを指定する必要はなくなっています。
その他特殊処理として、checked
やdisabled
などのブール値属性はchecked="checked"
のように展開することが行われています。
結論
よくわからないときは、ソースコードを読もう