このサイトについて

Rails Helper Helper は、Rails の Action View のヘルパーを、実際に動かして確かめるサイトです。引数や options を渡すと、どんな HTML ができて、ブラウザでどう表示され、フォームから何が送られるかがわかります。名前は、Rails のヘルパー(helper)を手伝う(help)もの、という意味です。

出力について

  • HTML は、サーバーで動いている Rails 8.1.4.1 が普段のビューと同じように ERB を描画した結果です。
  • params は、プレビューのフォームの値をサーバーの Rails に送り、Rails が作ったものです。
  • 選べる値は、ページごとに決めたものだけです。ERB に自由な Ruby のコードは書けません。
  • Rails の設定は load_defaults 8.1 です。設定によって出力が変わるものは、この既定値での結果です。
  • このサイトにはデータベースがないので、form_with の model で選べる保存済みのオブジェクト(Article.find(1))は、モデルの find が返す擬似的なものです。

説明文について

options の説明は、actionview のソースと実際の出力をもとに書いています。min や placeholder のように HTML 属性と同じ名前でも、Rails が値を変えたり HTML 属性を追加したりするものは、そのことを書いています。

説明文は日本語で書いています。英語版は日本語から訳したもので、不自然な言い回しや、意味のずれがあるかもしれません。

「ヘルパー共通の options」は、当てはまる範囲で 3 つに分けています。

〜_field 共通
text_field や email_field など、名前が _field で終わるヘルパー(Tags::TextField を継承するもの)
フォームヘルパー共通
name と id を作るフォームの部品。FormHelper はオブジェクト名と属性名から(Tags::Base)、FormTagHelper は引数の name から作ります
すべてのヘルパー共通
タグを出力するすべてのヘルパー(TagHelper の規則)

textarea と rich_textarea のページでは、〜_field 共通のうち同じように処理するもの(placeholder)を、「〜_field などと共通」として出しています。

ページに載せていないもの

Rails にはあるものの、細かすぎるなどの理由で、各ページの説明では省いている動きです。ここに書いた内容は、各ページほど詳しくは確かめていないので、各ページより間違いが多いかもしれません。

フォームヘルパー共通

  • multiple: true は、FormHelper の file_field 以外のヘルパーでも name 属性の値に [] を追加し、multiple 属性も追加します(checkbox は [] だけを追加します)。FormTagHelper では、select_tag のほかは [] を追加しません。これで、同じ name の HTML 要素を並べて複数の値も送れます。ただ、もとは select や file のように 1 つの HTML 要素で複数の値を送るもののための処理です。ほかのヘルパーでは本来の使い方ではないので、〜_field のページでは file_field にだけ出しています。
  • object、index、namespace、skip_default_ids、allow_method_names_outside_object は、form_with や fields_for が、フォームビルダーのメソッドに渡すための options です。各ヘルパーに自分で書くものではないので、各ヘルパーのページからは省いています(namespace、index、skip_default_ids、allow_method_names_outside_object は、form_with のページで見られます)。index に nil を渡すと、添え字の代わりに [] を追加します(text_field(:user, :name, index: nil) → name="user[][name]" id="user__name")。
  • 属性名の最後の ? は、name 属性と id 属性の値から外します(text_field(:user, :admin?) → name="user[admin]" id="user_admin")。
  • object_name が "user[]" の形なら、name 属性と id 属性の値に、オブジェクトの to_param を添え字として追加します。
  • オブジェクトの値を value にするときは、型を変える前の値(ユーザーが打ったままの文字列)を使います。数の属性の text_field に「abc」と打って送り、エラーでフォームを出し直すと、value 属性の値は「abc」になります(<属性>_before_type_cast を読むため)。ただ、date_field、datetime_field、time_field、month_field、week_field は、型を変えたあとの値を形を直して使うので、読めない値を打って出し直すと、value 属性はなくなります。
  • load_defaults 8.1 より前の設定(config.action_view.remove_hidden_field_autocomplete が false)では、hidden の <input> に autocomplete="off" も追加します。ただ、DateHelper の hidden の <input>(use_hidden や discard_year などで作るもの)には、この設定にかかわらず、いつも autocomplete="off" を追加します。
  • オブジェクトのその属性にエラーがあると、作った HTML 要素を <div class="field_with_errors"> で包みます(hidden の <input> は包みません)。包み方は config.action_view.field_error_proc で変えられます。
  • 〜_field は、options に type を渡すと、その値を type 属性の値にします(text_field(:user, :name, type: "email") → type="email")。checkbox と radio_button は、options に type を渡しても、checkbox や radio で上書きします。
  • form_with などに namespace を渡したときは、options の id に nil を渡しても、namespace の値が id になります。
  • placeholder と label の訳は、object_name とモデルの名前が違うと、モデルの名前のキー(helpers.placeholder.<モデルの名前>.<属性>)も探します。Active Model のモデルでは、activerecord.attributes の代わりに activemodel.attributes を探します。
  • multiple: true と一緒に options の name を渡すと、[] を追加せず、渡した値をそのまま使います(select、collection_checkboxes などの html_options の name も同じです)。複数の値を送るときは、q[] のように書きます。
  • number_field と range_field の in に、終わりのない範囲を渡すと RangeError、小数で終わりを含まない範囲(1.0...2.5)を渡すと TypeError になります。in と within を両方渡すと、within は HTML 属性になります。

すべてのヘルパー共通

  • 中身と HTML 属性の値はエスケープします。html_safe を付けた文字列(ほかのヘルパーの出力など)は、エスケープしません(HTML 属性の値の中の " だけは、&quot; にします)。
  • 真偽の HTML 属性(disabled など)は false か nil なら追加せず、それ以外なら追加します。文字列の "false" でも追加します。一覧(BOOLEAN_ATTRIBUTES)にない HTML 属性では、false も文字列にして、title="false" のような値になります。追加しないのは nil のときだけです。
  • aria: の値の true と false は、"true" と "false" という値になります。
  • data: に Hash 以外を渡すと、ただの data 属性になります。HTML 属性の名前をそのまま書いたとき("data-foo_bar": 1)は、_ の置き換えも JSON への変換もしません。

checkbox

  • options の checked を渡さないときは、オブジェクトの値と引数の checked_value を比べます。true と false、文字列、配列などで、比べ方が違います。
  • multiple: true のときに id 属性の値の後ろに追加する checked_value は、空白と . を _ にし、- と _ のほかの記号を消して、小文字にします(Yes Please なら article_published_yes_please)。options で id を渡すと、id 属性の値の後ろには追加せず、渡した値をそのまま使います。
  • checkbox_tag と radio_button_tag の checked は、disabled などと同じく、"true" や 1 でも追加します。

checkbox_tag

  • checkbox と違い、hidden の <input> を追加しません。
  • name のあとの引数は、value、checked、options の 3 つまでです。4 つ以上渡すと、ArgumentError になります。

radio_button

  • tag_value が空の文字列か nil なら、オブジェクトがなくても checked を追加します。

radio_button_tag

  • name と value は省けません。そのあとの引数は、checked と options の 2 つまでです。3 つ以上渡すと、ArgumentError になります。

DateHelper

  • 月の名前は訳(date.month_names)から取ります。use_short_month: true なら短い名前(date.abbr_month_names)、use_month_names に 12 個の配列を渡せば、その名前を使います。このサイトの日本語の訳は、短い名前も 1月 なので、use_short_month では変わりません。
  • 日付の並び順の訳(date.order)がないと、NoMethodError になります。Rails は訳がないときに空の配列を使うつもりで default: [] と書いていますが、I18n はこれを「代わりに探すキーの一覧」と読むので、訳がないという文字列が返るためです。このサイトは、日本語の訳(並び順と、prompt の datetime.prompts)を、rails-i18n と同じ値で用意しています。
  • with_css_classes に一部だけの Hash({ year: "y" })を渡すと、渡さなかった月や日の <select> には、空の class="" を追加します。
  • start_year と end_year の差が 1000 年を超えるとArgumentError になります(max_years_allowed で変えられます)。
  • <select> がいくつもあるヘルパー(date_select、select_date など)に discard_type: true を渡すと、全部の <select> が同じ name(user や date)になり、params には最後の 1 つの値しか残りません。そのため、discard_type は select_year などのページにだけ出しています。
  • date_select などのオブジェクトのヘルパーに prefix を渡すと、object_name の代わりに、渡した値を name 属性と id 属性の値の前の部分にします(prefix: "x" なら x[birthday(1i)])。field_name は、渡しても method で上書きします。
  • select_date などの 1 つ目の引数の date や datetime に Hash を渡すときは、分と秒のキーは min と sec です。minute と second のキーでは、どの <option> にも selected を追加しません。
  • <select> を 1 つだけ作るヘルパー(select_year など)に、その部分の discard_*(select_day なら discard_day: true)を渡すと、use_hidden: true と同じく hidden の <input> にします。
  • <select> を 1 つだけ作るヘルパー(select_year など)に include_position: true を渡すと、name 属性と id 属性の値に、(1i) などの位置を付けます(date[year(1i)])。date_select などが中で使うための option です。
  • 月のテキストの options を一緒に渡すと、use_month_numbers、use_two_digit_numbers、add_month_numbers、month_format_string の順に、先のものだけを使います。日は、day_format が use_two_digit_numbers より先です。
  • distance_of_time_in_words は、44 分 30 秒から 約1時間、89 分 30 秒から 約2時間、23 時間 59 分 30 秒から 1日、42 時間から 2日、29 日 23 時間 59 分 30 秒から 約1ヶ月、365 日から 約1年 にします。

email_field

  • multiple: true にすると、ブラウザはカンマでつないだ 1 つの値を送るので、params には要素が 1 つの配列が届きます。カンマ区切りの email を使う場面は少ないと判断し、ページからは省いています。

label

  • ブロックには LabelBuilder が渡されます。translation で訳した文字列を、object でフォームのオブジェクトを取り出せます(label(:user, :plan) { |b| "#{b.translation} *" })。
  • フォームヘルパー共通の name は消え、multiple はただの HTML 属性になります。
  • :value に合わせた訳(helpers.label.user.plan.premium)を入れると、helpers.label.user.plan は文字列ではなく Hash になります。そのため、:value を渡さない label(:user, :plan) は、その Hash を文字列にして中身にします({premium: "プレミアム"})。

ページを作っていないヘルパー

  • cdata_section は <![CDATA[…]]> の文字列を返します。HTML では、ブラウザがこれをコメントとして読むので、HTML の欄に出せません。
  • csp_meta_tag は、CSP の nonce の <meta> を作ります。このサイトは CSP を設定していないので、何も作りません。

csrf_meta_tags

  • csrf-token の <meta> の content 属性の値は、描画のたびに変わる長い文字列なので、このサイトでは伏せています((hidden))。

translate

  • このサイトの config/locales/examples/ja.yml・en.yml は、translate のページの例のための訳です。ページの ERB の欄の上に、ページの言語のファイルの中身をそのまま出しています。

url_for、current_page?、link_to_unless_current

  • このサイトの描画の API へのリクエストは POST /api/render なので、そのまま描画すると、current_page? がいつも false になります。そのため、この 3 つのページは、GET /articles?page=2 を開いたときのリクエストで描画しています。ページの ERB の欄の上に、そのリクエストを出しています。
  • このサイトの config/routes.rb の resources :articles(ArticlesController)は、url_for や form_with などのページの例で、URL を作るためだけのルートです。開いても、何も返しません。
  • url_for の port に、http で 80、https で 443 を渡したときは、ポートを付けません。
  • url_for の subdomain に false を渡すと、サブドメインを取ります(blog.example.com なら example.com)。ホストが IP アドレスのときは、subdomain も domain も使いません。
  • url_for に params.permit(…)(ActionController::Parameters)を渡すと、Hash と同じに扱います。permit していないと、ActionController::UnfilteredParameters になります。
  • url_for の controller は、今のコントローラーが名前空間の中にあると(api/params など)、同じ名前空間の中で探します。"/articles" のように / で始めると、名前空間の外を探します。
  • current_page? は、%20 などを元の文字に戻してから比べます(+ は空白に戻しません)。クエリ文字列は文字列のまま比べるので、順番が違うと false を返します。
  • link_to_unless_current の options の Hash に check_parameters: true や method を書くと、current_page? が使って、URL からは取り除きます。html_options の method は、今のページかどうかには関係しません。

AssetTagHelper

  • このサイトの app/assets/images/logo.png・logo@2x.png と app/assets/javascripts/application.js、app/assets/stylesheets/application.css は、ページの例のためのアセットです。ヘルパーが、本物と同じくハッシュを付けたパスを作れるようにするためだけに置いています。app/assets の audios/chime.mp3・videos/clip.mp4 と、public の sound.mp3・sound.ogg・movie.mp4・movie.webm は、audio_tag と video_tag のプレビューで再生できるようにするための短い音と動画です。どちらを読み込んだかわかるように、アセットと public で中身を変えています。public の photo.png・photo.webp は、image_tag、picture_tag、image_submit_tag のプレビューで、どの画像を読み込んだかわかるようにするための画像です。
  • favicon_link_tag の source の初めの値の "favicon.ico" は、このサイトのアセットにないので、渡さないと Propshaft::MissingAssetError になります。そのため、ページではいつも渡しています。
  • javascript_include_tag と stylesheet_link_tag は、config.action_view.preload_links_header が true(load_defaults 6.1 以降)なら、レスポンスに HTTP の Link ヘッダーも追加します。javascript_include_tag は、defer を渡したときは追加しません。preload_link_tag は、設定にかかわらずいつも追加します。options の preload_links_header(javascript_include_tag と stylesheet_link_tag だけ。preload_link_tag に渡すと、ただの HTML 属性になります)と nopush は、このヘッダーだけを変えるので、HTML は変わりません。そのため、ページでは扱っていません。
  • javascript_include_tag と stylesheet_link_tag に extname: false を渡すと、拡張子を付けずにアセットを探すので、Propshaft::MissingAssetError になります。
  • javascript_include_tag と stylesheet_link_tag は、Rails だけなら同じ source を 1 つにまとめます。ただ、Propshaft はこの 2 つのヘルパーを上書きして、source を 1 つずつ Rails に渡します。そのため、このサイトのように Propshaft を使うアプリでは、同じ文字列を 2 回渡すと <script> や <link> が 2 つできます(javascript_include_tag("application", "application"))。渡す一覧をプログラムで組み立てるときに起きることがあります。
  • stylesheet_link_tag も、javascript_include_tag と同じく nonce を受け取ります(true は CSP の nonce、false は追加しない、文字列はそのまま)。このサイトは CSP を設定していないので、ページでは扱っていません。

asset_path、asset_url

  • config.relative_url_root(アプリをサブディレクトリに置くときの設定)があれば、URL のほかは、パスの前にそれを付けます(すでに付いているときは付けません)。image_tag などのタグのヘルパーも同じです。このサイトは nil です。
  • host(と config.asset_host)には Proc も渡せます。パスを渡して呼び、返した値をホストにします(2 つ目の引数を受け取るなら、今のリクエストも渡します。nil を返すと、asset_path はホストを付けず、asset_url は今のリクエストのホストを付けます)。

button_to

  • ブロックを渡すと、引数が 1 つずつ前にずれて、ブロックの出力を <button> の中身にします(button_to("/articles", class: "x") do … end)。ページでは、ブロックの形は扱っていません。
  • config.action_view.button_to_generates_button_tag が false のアプリ(load_defaults 7.0 より前)では、<button> の代わりに <input type="submit"> を作り、引数の name を value 属性の値にします。このサイトは true です。
  • config.action_view.prepend_content_exfiltration_prevention を true にすると、<form> の前に、開いたままの属性やタグを閉じるための HTML(<!-- '"` --> など)を追加します。form_tag と form_with も同じです。このサイトは、初めの値の false です。
  • ブロックを渡すと、引数が 1 つずつ前にずれて、ブロックの出力を中身にします(link_to("/articles", class: "x") do … end)。ページでは、ブロックの形は扱っていません。
  • html_options に href を渡すと、options の URL の代わりに、それを使います。
  • ブロックを渡すと、<a> を作らないときに、ブロックの出力を返します。ブロックには、引数の name を渡します。ブロックが 2 つ以上の引数を受け取るなら、name、options、html_options を渡します。<a> を作るときは、ブロックを使いません。ページでは、ブロックの形は扱っていません。

phone_to、sms_to

  • ブロックを渡すと、ブロックの出力を <a> の中身にします。mail_to と同じです。ページでは、ブロックの形は扱っていません。

mail_to

  • ブロックを渡すと、ブロックの出力を <a> の中身にします(mail_to("me@example.com") do … end)。引数の name も渡したときは、name を使いません。ページでは、ブロックの形は扱っていません。

TextHelper

  • highlight にブロックを渡すと、highlighter の代わりに当てはまった部分ごとにブロックを呼び、その出力で置き換えます(highlighter の \1 と違い、当てはまった部分も出力もエスケープしません)。truncate にブロックを渡すと、切ったときだけ、ブロックの出力を後ろに足します(ブロックの出力は、長さに数えません。escape: false でも、html_safe でなければエスケープします)。ページでは、ブロックの形は扱っていません。
  • cycle は、呼ぶたびに、渡した値を順に 1 つずつ返します(表の行を交互に色分けするときなど)。1 回の呼び出しでは動きが見えないので、ページは作っていません。
  • truncate の length が omission より短いと、omission だけを返します(length: 2 でも ... の 3 文字)。separator には正規表現も渡せます。
  • simple_format は、文字列の初めと終わりの改行には <br /> を追加しません。\r\n と \r も改行として扱います。
  • word_wrap の break_sequence に \1 や \0 を入れると、置き換えの文字列として読まれ、nil を返します。
  • pluralize の count が nil なら、0 と書きます(0 people)。
  • excerpt は、返す文字列の前後の空白を取ります。text か phrase が nil なら、nil を返します。

NumberHelper

  • number_to_human の units には、単位の名前の訳の scope("number.human.decimal_units.units" など)も渡せます。Hash の key は Symbol(:unit、:thousand など)で、文字列の key ではエラーになります。
  • 日本語のページの number_to_human_size は、Rails が持っている英語の形を使いますが、1 バイトも Bytes になります(英語の訳では Byte)。
  • number_to_phone に数でない値を渡しても、末尾に数字が並んでいれば、そこに区切りを入れます("tel 5551234" は tel 555-1234)。

SanitizeHelper

  • このサイトは load_defaults 8.1 なので、sanitize、strip_tags、strip_links は HTML5 のサニタイザー(config.action_view.sanitizer_vendor)で処理します。HTML4 のサニタイザーでは、strip_tags が <script> の中身も消すなど、動きが違います。
  • sanitize の scrubber には、Loofah の名前(:prune など)も渡せます。

tag

  • 引数を渡す古い書き方(tag(name, options = nil, open = false, escape = true))もあります。Rails のドキュメントでは、将来の Rails で非推奨にする書き方とされています。
  • 古い書き方では、要素の種類にかかわらず、中身のない要素を /> で閉じます(tag(:br) なら <br />、tag(:div) なら <div />)。3 つ目の引数の open を true にすると、> で閉じます(<div class="x">)。
  • 2 つ目の引数の options は、tag.div の options と同じく HTML 属性にします。4 つ目の引数の escape を false にすると、HTML 属性の値をエスケープしません。要素の名前の _ は - にしません(<my_element />)。

token_list

  • トークンはエスケープします。&amp; のようにもうエスケープした文字列は、一度元に戻してからエスケープするので、二重にはなりません。html_safe を付けた文字列も、ほかのヘルパーと違い、エスケープします。
  • ほかのヘルパーの class に配列や Hash を渡したとき(tag.div(class: ["btn", {active: true}]))と違い、空白で区切ったり、同じトークンを 1 つにしたりします。

javascript_tag

  • ブロックを渡すと、ブロックの出力を中身にします。このとき、1 つ目の引数に Hash を渡すと html_options にします(文字列を渡すと使いません)。ページでは、ブロックの形は扱っていません。
  • 中身に ]]> があると、CDATA が途中で閉じないように、]]]]><![CDATA[> に分けて出力します。

collection_checkboxes

  • options の readonly も、disabled と同じく、値、値の配列、Proc を渡せます。当てはまるチェックボックスに readonly を追加しますが、HTML の仕様では、チェックボックスは readonly でもチェックを付け外しできます。
  • html_options に id を渡すと、全部のチェックボックスの id 属性と <label> の for 属性の値が、同じになります。
  • html_options に disabled: true を渡しても、先頭の hidden の <input> には追加しないので、空の値が送られます。
  • html_options に index を渡すと、チェックボックスの name 属性の値には添え字が入りますが、先頭の hidden の <input> の name 属性の値には入りません。options に渡すと、逆に hidden の <input> にだけ入ります。
  • ブロックの b.checkbox と b.label には、HTML 属性の Hash を渡せます(html_options と同じキーは、html_options の値になります)。collection_radio_buttons の b.radio_button も同じです。

collection_radio_buttons

  • options の checked に配列を渡すと、当てはまる全部のラジオボタンに checked を追加します(checked: [1, 2] なら 2 つ)。
  • options の readonly、html_options の id、disabled、index は、collection_checkboxes と同じです。readonly を付けても、ラジオボタンは選べます。

collection_select

  • value_method に Proc を渡したときに、options の selected か disabled にも Proc を渡すと、その Proc が真を返したところで TypeError になります。
  • collection の要素が配列なら、その中の Hash を、その要素の <option> の HTML 属性にします([[1, "A", { class: "x" }]] と :first、:second)。collection_checkboxes、collection_radio_buttons、options_from_collection_for_select も同じで、html_options の同じキーより先に使います。

grouped_collection_select

  • option_key_method に Proc を渡したときに、options の selected か disabled にも Proc を渡すと、その Proc が真を返したところで TypeError になります。collection_select と同じです。

grouped_options_for_select

  • divider と一緒に Hash を渡すと、グループの名前(キー)も、ふつうの <option> として並びます。
  • グループの形でない配列(%w[basic pro])を渡すと、NoMethodError になります。

fields_for

  • FormBuilder の f.fields_for で record_name を "comments[]" の形にすると、article[comments][1][body] のように、record_object の id を添え字にします。
  • record_name には、Symbol の代わりにオブジェクトを渡せます(fields_for @comment)。モデルの名前(comment)を name 属性と id 属性の値の前の部分にして、record_object にそのオブジェクトを渡したのと同じになります。
  • FormHelper の fields_for は、record_object に渡した Hash を、options として扱いません(FormBuilder の f.fields_for は扱います)。fields_for :comment, index: 1 と書くと Hash をオブジェクトとして使うので、c.text_field :body などで値を読もうとしてNoMethodError になります。record_name にオブジェクトを渡したとき(fields_for @comment, index: 1)は、Hash を使わないので、options も使いません。options も渡すときは、fields_for :comment, nil, index: 1 のように、record_object に nil を入れます。
  • FormBuilder の f.fields_for で include_id を渡さないときは、外のフォーム(form_with や、ネストの外側の f.fields_for)に渡した include_id を使います。form_with の options の説明には載っていませんが、form_with(model: @article, include_id: false) のように渡しても、内側の f.fields_for はその値を使います。form_with や f.fields に skip_id: true を渡しても、include_id: false と同じです(f.fields_for に渡しても効きません)。

fields

  • fields は、form_with と同じ書き方(fields(:author, model: @author))で呼べる fields_for です。違うのは、allow_method_names_outside_object の初めの値が true なことと、ブロックの中で作る HTML 要素の id を config.action_view.form_with_generates_ids で決めることだけです。form_with と一緒に、fields_for の置き換えとして入りました(Rails 5.1)が、置き換わらずに両方が残っています。動きは fields_for と大きく変わらず、GitHub で探した限りでは実際のアプリでもほとんど使われていないので、fields のページは作っていません。

f.button

  • 外のフォームに scope や as を渡すと、引数の value に Symbol を渡したときの name 属性と id 属性の値の前の部分が、その値になります(post[draft])。中身の訳を探すキーも変わり、helpers.submit.article.create の代わりに helpers.submit.post.create を探します。namespace は、Symbol から作る id 属性の値の前にだけ追加します。
  • 外のフォームにオブジェクトがない(form_with(url: "/search") など)と、中身の訳は helpers.submit.submit を探します。Rails が持っている英語の訳では Save Post、訳がなければ Submit Post のように、scope の名前をつなぎます。scope もないときは、Save のあとに空白が 1 つ残ります。
  • formmethod を書き換えるかは、値に post か get が含まれるかで決めます。そのため、"postx" のような値は書き換えません。

f.submit

  • 引数の value に Symbol を渡すと、文字列にして value 属性の値にするだけです(f.submit :draft なら value="draft")。f.button と違い、name と id は作りません。
  • :value を渡すと、value 属性の値はその値になりますが、data-disable-with 属性の値は 1 つ目の引数の value の文字列のままです(f.submit "Save", value: "Other" なら value="Other" data-disable-with="Save")。
  • formmethod: :delete を渡すと、formmethod="delete" をそのまま追加します。f.button と違い、_method への書き換えはしません。
  • config.action_view.automatically_disable_submit_tag を false にすると、data-disable-with を追加しません。設定がなければ true です。
  • ブロックを渡しても使いません。エラーにもなりません。
  • 訳のキーは、f.button と同じく、外のフォームに scope や as を渡すと、その名前のキー(helpers.submit.post.create)を探します。
  • data: { disable_with: false } を渡すと、data-disable-with を追加しません。options に "data-disable-with" も渡すと、そちらを使います。
  • options の type で、type="submit" を変えられます(type: "button" など)。

field_id、field_name

  • field_id に、"article[comments][]" のように最後が [] の object_name を渡すと、_ が 2 つ続いた article_comments__title になります。
  • field_name は field_id と違い、モデルのオブジェクトを渡すと、そのオブジェクトの to_s を前の部分にします(#<Article:0x…>[tags])。

file_field

  • include_hidden の hidden の <input> は、Active Storage の has_many_attached に空を送り、添付を全部外せるようにするためのものです。編集の画面で何も選ばずに送ると、今ある添付が外れます。
  • include_hidden の hidden の <input> には、name だけを追加します。checkbox と違い、disabled や form は追加しません。そのため、file の <input> に disabled 属性を追加しても hidden の <input> の空の値は送られ、今ある添付が外れます。
  • フォームビルダーの f.file_field で呼ぶと、外の form_with や form_for に enctype="multipart/form-data" を追加します(ネストした f.fields_for の中でも)。file_field を直接呼ぶと、追加しません。

rich_textarea

  • ブロックの中身は、hidden の <input> の value に入るときに < や > がエスケープされません。options の value を渡すか、オブジェクトに値があると、ブロックは使いません。
  • disabled でも、Trix はファイルのドロップと貼り付けを受け付けます(Trix が hidden の <input> も disabled にするので、送られはしません)。

options_for_select

  • 引数の selected に Proc を渡しても、どの <option> にも selected を追加しません。collection_select と違い、Proc を呼びません。
  • container にグループの形({ "Free" => ["basic"] })を渡しても、<optgroup> にはならず、value="[&quot;basic&quot;]" の <option> になります。グループにするときは、grouped_options_for_select を使います。
  • container に文字列を渡すと、そのまま返します。

options_from_collection_for_select

  • value_method に Proc を渡したときに、引数の selected にも Proc を渡すと(key が selected と disabled の Hash も)、その Proc が真を返したところで TypeError になります。collection_select と同じです。

option_groups_from_collection_for_select

  • option_key_method に Proc を渡したときに、selected_key にも Proc を渡すと(key が selected と disabled の Hash も)、その Proc が真を返したところで TypeError になります。grouped_collection_select と同じです。

search_field

  • かつての Safari 用の HTML 属性に、autosave(最近の検索を保存するときの名前)と results(最近の検索の一覧に出す数)があります。autosave を渡すと、results がなければ results="10" も追加します。Mac の Safari で試しても動きが確かめられず、情報も見つからなかったので、ページからは省いています。autosave: true を渡すと、ホストの名前を逆に並べた値にするはずの処理が、NameError になります(Rails 8.1.4.1 の Tags::SearchField に request がないため)。

select

  • ブロックを渡すと、choices の代わりに、ブロックの出力を <select> の中身にします。そのときは choices を省けます(select(:user, :plan) do … end)。
  • choices には Range も渡せます(1..3 なら、テキストと value が 1、2、3)。
  • html_options の required で空の <option> を追加するのは、multiple がなく、size が 1 のときだけです。
  • options の prompt と include_blank を両方渡すと、両方の <option> を追加します。disabled: "" や selected: "" を一緒に渡すと、prompt の <option> に disabled や selected を追加します。
  • multiple: true のとき、html_options の disabled は、先頭の hidden の <input> にも追加します。collection_select、grouped_collection_select も同じです。

select_tag

  • select と違い、options に required を渡しても、空の <option> を追加しません。multiple: true を渡しても、value が空の hidden の <input> を追加しません。
  • name 属性の値に [] を追加するのは、multiple が true のときだけです。multiple: "multiple" を渡すと、multiple 属性は追加しますが、[] は追加しません。
  • prompt と include_blank を両方渡すと、prompt の <option> を先にして、両方を追加します。

form_with

  • ブロックを渡さないときは、<form> の開くタグと hidden の <input> だけを出力し、</form> は出力しません。中身と </form> は、自分で書きます。
  • authenticity_token には文字列も渡せます。その文字列を、そのまま CSRF のトークンを入れる hidden の <input> の value 属性の値にします。
  • local を渡さないときは true で、data-remote="true" を追加しません。config.action_view.form_with_generates_remote_forms が false のためです(load_defaults 6.1 以降)。
  • skip_enforcing_utf8: false か enforce_utf8: true にすると、name="utf8" の hidden の <input>(値は ✓)を追加します。古いブラウザに、UTF-8 で送らせるためのものです。どちらもデフォルトでは追加しません。config.action_view.default_enforce_utf8 が false のためです(load_defaults 6.0 以降)。

time_zone_select

  • options の model に all を持つクラスを渡すと、ActiveSupport::TimeZone の代わりに、そのクラスの all の一覧を使います。
  • time_zone_options_for_select の 3 つ目の引数 model も、time_zone_select の options の model と同じです。
  • priority_zones に名前の文字列の配列(["Tokyo"])を渡すと、NoMethodError になります。ActiveSupport::TimeZone のオブジェクトか、正規表現を渡します。time_zone_options_for_select も同じです。
  • オブジェクトの値と default は、名前の文字列("Tokyo")で比べます。ActiveSupport::TimeZone のオブジェクトでは、どれも選びません。

textarea

  • 中身の前に改行を 1 つ追加します。HTML では <textarea> の直後の改行は読み飛ばされるので、中身が改行で始まるとき(先頭に空の行がある文章など)に、その改行が消えないようにするためです。中身が改行で始まらなければ、追加した改行が読み飛ばされるだけで、何も変わりません。

weekday_select

  • 曜日の名前は、訳(date.day_names)から取ります。Rails は英語の訳しか持たないので、rails-i18n などで訳を用意しないと、英語以外の言語ではNoMethodError になります。このサイトは、日本語の訳(曜日と月の名前)を、rails-i18n と同じ値で用意しています。
  • Rails 7.0 で入りました。
  • ブロックを渡しても使いません。エラーにもなりません。