#この記事の内容
- form_withメソッドの使い分け
- それに伴うストロングパラメータの取り扱い
- フォーム内容をHTTP通信させる方法
#環境
$ rails -v
Rails 6.0.3.1
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
#form_withとは
フォーム送信するためのUI部品をビルドするメソッドで、自動でサーバー側のコントローラアクションを切り替えてくれる特徴を持つ。
切り替える要因となるのは、オプションのmodelやurlに対する値によって変わり、以下のようになる。
オプション | @userの中身 | 呼び出されるアクション | 用途 |
---|---|---|---|
model: @user | User.new | create | ユーザー作成 |
model: @user | User.find() | update | ユーザー編集 |
url: sessions_path | create | ユーザーログイン |
また、オプションの違いを比較すると、以下のようになる。
| オプション|入力エリアのname属性|ストロングパラメータ|
|:---|:----|:---|:---|:---|
| model: @user|name="user[email]"|params.require(:user).permit(:email)|
| url: users_path|name="email"|params.permit(:email)|
##modelオプションを使った例
<%= form_with model: @user do |f| %>
<%= f.label :name, "名前" %>
<%= f.text_field :name, placeholder: "山田" %>
<%= f.submit "登録する" %>
<% end %>
##urlオプションを使った例
<%= form_with url: sessions_path do |f| %>
<%= f.label :name, "名前" %>
<%= f.text_field :name, placeholder: "山田" %>
<%= f.submit "ログインする" %>
<% end %>
##localオプション
実は、デフォルトでremote: true
オプションが付与されており、いわゆるAjax通信をするようにあらかじめ設定されている。
そのため、特に何も設定しないと、renderメソッドが行われないことによるflashが表示されなかったりする。
通常のHTTP通信を行うために、以下のような設定を行うことで、上記の問題を解決することができる。
<%= form_with model: @user, local: true do |form| %>
##まとめ
form_withは、自動でHTTPリクエストの種類を判別してくれるので、便利。