このサイトについて
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 属性の値の中の"だけは、"にします)。 - 真偽の 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です。
link_to
- ブロックを渡すと、引数が 1 つずつ前にずれて、ブロックの出力を中身にします(
link_to("/articles", class: "x") do … end)。ページでは、ブロックの形は扱っていません。 - html_options に
hrefを渡すと、options の URL の代わりに、それを使います。
link_to_if、link_to_unless
- ブロックを渡すと、
<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
- トークンはエスケープします。
&のようにもうエスケープした文字列は、一度元に戻してからエスケープするので、二重にはなりません。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="["basic"]"の<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 で入りました。
- ブロックを渡しても使いません。エラーにもなりません。