Railsのform helper周りのコードリーディングをしました。Railsのバージョンは5.1.5です。

今回はこのパターンを追ってみます。

#form_withはActionView::Helpers::FormHelperに定義されています。

blockが渡されているのでblock_given?はtrueになります。builderは特に設定されていなければ::ActionView::Helpers::FormBuilderのインスタンスになります。default_form_builderのデフォルト値はlib/action_view/helpers/form_helper.rbに定義されています。

#form_tag_with_bodyは#form_tag_htmlを呼び出し、#form_tag_htmlとcontentと</form>を連結して返します。

#extra_tags_for_formはUTF8用のタグ、メソッドタグ(HTML的にはformからはPOSTとGETしか打てないので、DELETEやPUTなどのメソッドを呼び出すように_methodのクエリパラメータを入れてRailsにメソッドを認識させる)、CSRF用のトークンのタグを生成しています。

#tagはタグを生成します。tag_builderはActionView::Helpers::TagHelper::TagBuilderのインスタンスで#tag_optionsでoptionsからよしなにタグの属性値を出力します。

formの中身はActionView::Helpers::CaptureHelper#captureで生成します。

yieldの引数はbuilderなので |f|で指定する変数はFormBuilderのインスタンスになります。

ActionView::Helpers::FormBuilder#labelは@template.labelを呼び出します。

@templateはviewの実行コンテキストで最終的にActionView::Helpers::FormHelper#labelが呼ばれます。

AtionView::Helpers::Tags::Label#renderがlabelのタグを生成している部分になります。

text_fieldはclass_evalで定義されたメソッド経由で@templateのtext_fieldメソッドを呼び出します。

text_fieldメソッドはlabelと同じような感じでActionView::Helpers::Tags::TextField#renderによってinputタグが生成されます。

ちなみにinputタグのnameはActionView::Helpers::Tags::Base#tag_nameで生成されます。