9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】form_withを完全に理解した

Posted at

#この記事の内容

  • 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オプションを使った例

.erb
<%= form_with model: @user do |f| %>
  <%= f.label :name, "名前" %>
  <%= f.text_field :name, placeholder: "山田" %>

  <%= f.submit "登録する" %>
<% end %>

##urlオプションを使った例

.erb
<%= 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通信を行うために、以下のような設定を行うことで、上記の問題を解決することができる。

.erb
<%= form_with model: @user, local: true do |form| %>

##まとめ

form_withは、自動でHTTPリクエストの種類を判別してくれるので、便利。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?