ActionView::Helpers::UrlHelper
def button_to(name = nil, options = nil, html_options = nil, &block)

説明

<button> だけの <form> を作ります。

引数

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

= nil
<button> の中身にします。中身はエスケープします。デフォルトでは action と同じ文字列を中身にします。options だけを渡すときも、ここに nil を書きます。
<form> の action 属性の値にする URL です。url_for に渡すので、渡す値によって、次のように変わります。
  • 文字列:そのまま action 属性の値にします。article_path(1) のようなルートのヘルパーも、URL の文字列を返すので同じです。
  • モデルのオブジェクト:ルーティングから、そのオブジェクトの URL を作ります。html_options の method を渡さないときは、保存済みのオブジェクトなら _method が patch の hidden の <input> を追加します。
  • Hash:ルーティングから URL を作ります({ controller: "articles", action: "index" } なら /articles)。
  • :back:リクエストに Referer があればその URL、なければ javascript:history.back() にします。ただ、javascript:history.back() からはフォームごとの CSRF のトークンを作れないので、NoMethodError になります(method が :get のときと、authenticity_token に false を渡したときは、トークンを作らないので、なりません)。このサイトでは、描画の API へのリクエストの Referer がこのページなので、このページの URL になります。
  • false:action を追加しません。
html_options= {}
渡す値によって、次のように変わります。
  • :get:<form> を method="get" にして、CSRF のトークンの hidden の <input> を追加しません。
  • :patch、:put、:delete:<form> を method="post" にして、_method の hidden の <input> を <button> の前に追加します。Rails は届いた POST の _method を見て、PATCH などとして扱います。
  • :post:<form> を method="post" にします。
  • デフォルト:引数の options が保存済みのオブジェクトなら :patch と同じで、それ以外は :post と同じです。
文字列は小文字にしないので、"DELETE" や "GET" を渡すと method="post" にして、_method も追加しません。link_to と違い、<button> に data-method を追加しません。
{q: "ruby", page: 2}
渡した Hash の key と値ごとに、name が key で value が値の hidden の <input> を追加します。name の順に並べ替えて、<button> と CSRF のトークンのあとに置きます。値が配列なら tags[]、Hash なら user[name] の形の name 属性の値にします。値が nil なら、value を追加しません。
{id: "article_form"}
渡した Hash を、<form> の HTML 属性にします。次の key は、扱いが違います。
  • class:class 属性の値に、button_to の代わりに渡した値を使います。key を文字列にした "class" だと、class が 2 つになります(class="c" class="button_to")。
  • method、action:渡しても使いません。<form> の method は html_options の method から、action は引数の options から作ります。
"inline"
渡した値を、<form> の class 属性の値にします。html_options の form にも key の class があると、form の値を使います。このときは、この option がそのまま <button> の form_class 属性になります。
false にすると、CSRF のトークンの hidden の <input> を追加しません。文字列を渡すと、その文字列をトークンの hidden の value 属性の値にします。html_options の method が :get のときは、どの値でもトークンを追加しません。
true にすると、<form> に data-remote="true" を追加します。Rails UJS を入れていないアプリ(Rails 7 以降の標準)では、この HTML 属性は何もしません。
"button"
渡しても使いません。<button> の type 属性の値は、いつも submit です。
ヘルパー共通の options

Rails はどのヘルパーでも、これらの options を同じように処理します。HTML の仕様で <button> に使えないものや、使う場面が少ないとこのサイトで判断したものは、ここでは省いています。

すべてのヘルパー共通

true にすると disabled="disabled" を追加し、false にすると追加しません。readonly、required、autofocus など、Rails が持っている一覧(BOOLEAN_ATTRIBUTES)にある HTML 属性はどれも同じで、値が false と nil 以外なら 属性名="属性名" の形で追加します。
{active: true, hidden: false}
Hash を渡すと、値が false と nil 以外のキーを空白でつなぎます。配列を渡すと、nil、false、空の文字列(空白だけの文字列も)を外して、空白でつなぎます。
{controller: "tags", tags_suggestions_value: ["ruby", "rails"]}
Hash を渡すと、キーの _ を - にして、data-* 属性を追加します。値に配列や Hash を渡すと、JSON の文字列にします。
{describedby: ["name_help", "name_error"], invalid: false}
:data と同じく、aria-* 属性を追加します。値が配列なら、nil と空の文字列を外して、空白でつなぎます(何も残らなければ、追加しません)。値が Hash なら、値が false と nil 以外のキーを空白でつなぎます。
ここにない html_options は、<button> の HTML 属性になります。値が nil なら、その HTML 属性は追加しません。

ERB

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


          

HTML


          

プレビュー

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

フォーム送信

フォームデータ

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

Content-Type:


              

params


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