従来、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"のように展開することが行われています。
結論
よくわからないときは、ソースコードを読もう