In Rails 5.1すべてのフォームはform_with
で実行する必要があります。In http://edgeguides.rubyonrails.org/5_1_release_notes.html#unification-of-form -for-and-form-tag-into-form-with モデルに関連するフォームの例しか見つかりません。
このRails 5.0フォームをRails 5.1 with form_with
で実行する正しい方法は何ですか?
<%= form_tag("/search", method: "get") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q) %>
<%= submit_tag("Search") %>
<% end %>
これがform_with
呼び出しです。これは、質問からのform_tag
呼び出しとまったく同じです。
<%= form_with url: '/search', method: :get, local: true do |f| %>
<%= f.label :q, "Search for:" %>
<%= f.text_field :q, id: :q %>
<%= f.submit "Search" %>
<% end %>
form_with
はデフォルトでXHR(別名remote: true
)を介して送信され、local: true
のデフォルトのform_tag
のように動作させるにはremote: false
を追加する必要があることに注意してください。
詳細については、 Railsガイド 、 APIドキュメント および このgithubの問題に関するディスカッション を参照してください。
form_with
はRails 5.1
の機能を更新し、Rails form_for
またはform_with
として使用できるフォームを作成するための統一された方法特定のオプション
:url-フォームが送信するURL。 url_forまたはlink_toに渡される値に似ています。たとえば、名前付きルートを直接使用できます。 :scopeが:urlなしで渡されると、フォームは現在のURLに送信するだけです。
:method-フォームを送信するときに使用するメソッド。通常は「get」または「post」のいずれかです。 「patch」、「put」、「delete」、または別の動詞が使用されている場合、_methodという名前の非表示の入力が追加され、動詞のオーバーポストをシミュレートします。
:format-フォームが送信するルートのフォーマット。 :jsonなどの別のリソースタイプに送信する場合に便利です。 :urlが渡された場合はスキップされます。
:scope-入力フィールド名にプレフィックスを付けるスコープ。これにより、送信されたパラメーターがコントローラーでどのようにグループ化されるか。
:model-:urlと:scopeを推測し、入力フィールドの値を入力するモデルオブジェクト。したがって、title属性が「Ahoy!」に設定されている場合その場合、タイトル入力フィールドの値は「Ahoy!」になります。モデルが新しいレコードの場合は作成フォームが生成されますが、既存のレコードの場合は更新フォームが生成されます。 :scopeまたは:urlを渡して、デフォルトをオーバーライドします。例えば。 params [:post]をparams [:article]に変換します。
:authenticity_token-フォームで使用する認証トークン。カスタム認証トークンでオーバーライドするか、falseを渡して、認証トークンフィールドを完全にスキップします。有効なフィールドを制限する可能性のある支払いゲートウェイなどの外部リソースに送信する場合に便利です。リモートフォームは、config.action_view.embed_authenticity_token_in_remote_forms = falseを設定することにより、埋め込まれた認証トークンを省略できます。これは、フォームをフラグメントキャッシュするときに役立ちます。リモートフォームはメタタグから認証トークンを取得するため、JavaScriptを使用しないブラウザをサポートしていない限り、埋め込みは不要です。
:local-デフォルトでは、フォームの送信はリモートで目立たないXHRです。 local:trueでリモート送信を無効にします。
:skip_enforcing_utf8-デフォルトでは、utf8という名前の非表示フィールドが出力され、UTF-8送信を強制します。フィールドをスキップするには、trueに設定します。
:builder-フォームの作成に使用されたオブジェクトをオーバーライドします。
:id-オプションのHTMLid属性。
:class-オプションのHTMLクラス属性。
:data-オプションのHTMLデータ属性。
:html-フォームタグの他のオプションのHTML属性。
<%= form_with(model: @post, url: super_posts_path) %>
<%= form_with(model: @post, scope: :article) %>
<%= form_with(model: @post, format: :json) %>
<%= form_with(model: @post, authenticity_token: false) %>
form_with
の名前空間付きルートの例Admin_post_urlのような名前空間付きルートの場合:
<%= form_with(model: [ :admin, @post ]) do |form| %>
...
<% end %>
関連するリソースと
たとえば、リソースに関連付けが定義されている場合、ルートが正しく設定されていれば、ドキュメントにコメントを追加できます。
<%= form_with(model: [ @document, Comment.new ]) do |form| %>
...
<% end %>
詳細についてはチェックアウト doc
次のようにform_with
を使用できます。
<%= form_with(url: '/search') do |f| %>
<%= f.label(:q, "Search for:") %>
<%= f.text_field(:q, id: :q) %>
<%= f.submit("Search") %>
<% end %>