ActionView::Helpers::FormHelper
def form_with(model: false, scope: nil, url: nil, format: nil, **options, &block)

説明

<form> を作り、その中にブロックの中身を出力します。

引数

値を変えると、ERB と HTML が変わります。

= false
渡したオブジェクトの値を、ブロックの中で作る HTML 要素の初期値に使います。引数の scope と url、options の method を渡さないときの値も、このオブジェクトから決めます。
  • 配列([@article, @comment]):url は配列全体から作り(/articles/1/comments/1)、そのほかは配列の最後にあるオブジェクトから決めます。
  • nil:ArgumentError になります。
= nil
ブロックの中で作る HTML 要素の name 属性と id 属性の値の前の部分になります。デフォルトでは、model があればモデルの名前、なければ属性名だけになります。model がなく、scope と同じ名前のインスタンス変数があれば、その値を HTML 要素の初期値に使います。
= nil
<form> の action 属性の値になります。デフォルトでは、model があればモデルから作り、なければそのフォームを描画したリクエストの URL になります。このサイトでは ERB を描画しているのが /api/render へのリクエストなので、/api/render になります。false を渡すと、action を追加しません。
= nil
model から作る URL の最後に追加します。model がなければ使いません。url を渡しても使いません。
options= {}
渡す値によって、次のように変わります。
  • :get:CSRF のトークンの hidden の <input> を追加しません(ほかの値では追加します)。
  • :patch、:put、:delete:method="post" にして、_method の hidden の <input> も追加します。Rails は届いた POST の _method を見て、PATCH などとして扱います。
  • デフォルト:保存済みの model なら :patch、それ以外は :post になります。
false にすると、data-remote="true" を追加します。Rails UJS を入れていないアプリ(Rails 7 以降の標準)では、この HTML 属性は何もしません。
true にすると、enctype="multipart/form-data" を追加します。ブロックの中で f.file_field を使うと、渡さなくても、false を渡しても追加します。
false にすると、CSRF のトークンの hidden の <input> を追加しません。
"article_form"
<form> の id 属性の値になります。
{novalidate: true}
Hash の中身を <form> の HTML 属性にします。ただ、method、multipart、remote、authenticity_token、enforce_utf8 は、options で渡したときと同じに扱い、HTML 属性にはしません。action は使いません(false なら action を追加しません)。options の id、class、data と同じキーを渡すと、こちらを使います。
"admin"
ブロックの中で作る HTML 要素の id 属性の値の前に追加します。name 属性の値は変わりません。
1
ブロックの中で作る HTML 要素の name 属性と id 属性の値に、添え字として追加します。model も scope もなければ追加しません。nil を渡すと、添え字の代わりに [] を追加します(article[][title])。
true にすると、ブロックの中で作る HTML 要素に id を追加しません。f.label の for も追加しません。デフォルトでは id を追加します。config.action_view.form_with_generates_ids が true のためです(load_defaults 5.2 以降)。
false にすると、モデルにない属性の値をモデルから読もうとして、NoMethodError になります。デフォルトでは、モデルにない属性では、初期値のない HTML 要素を作ります(&block の f.text_field :subtitle で試せます)。
LabeledFormBuilder
ブロックの f(FormBuilder)のクラスを変えます。このページの LabeledFormBuilder は、text_field の前に同じ属性の label を追加するように、FormBuilder の text_field を上書きしたクラスです。
ヘルパー共通の options

Rails はどのヘルパーでも同じように処理します。ただ、form_with が <form> の HTML 属性にするのは、class と data だけです。

すべてのヘルパー共通

{active: true, hidden: false}
Hash を渡すと、値が false と nil 以外のキーを空白でつなぎます。配列を渡すと、nil、false、空の文字列(空白だけの文字列も)を外して、空白でつなぎます。
{controller: "tags", tags_suggestions_value: ["ruby", "rails"]}
Hash を渡すと、キーの _ を - にして、data-* 属性を追加します。値に配列や Hash を渡すと、JSON の文字列にします。
ここにない options は、<form> の HTML 属性にはならず、ブロックのフォームビルダーに渡す設定として扱います。<form> に追加したいほかの HTML 属性は、:html で渡します。accept-charset="UTF-8" は、どんなときも追加します。:html で別の値を渡しても、UTF-8 になります。
&block= nil

ERB

直前との違い: 追加 削除 変更


          

HTML


          

プレビュー

プレビューを操作すると、フォーム送信の内容が変わります。

フォーム送信

フォームデータ

namevalue
リクエストボディを見る

Content-Type:


              

params


              
このサイトでは、CSRF のトークンの値を伏せています((hidden))。本物は、描画のたびに変わる長い文字列です。