【Rails】form_withについて
forma_withとは、
railsで情報を送信するためのヘルパーメソッドです。
form_withにより、簡単にHTMLを作成することができます。
form_withの使い方
ビューファイル (データベースに保存しない時)
<%= form_with url: "users_path" do |form| %> <%= form.text_field :email %>
<%= form.submit %> <% end %>
ビューファイル(データベースに保存する時)
<%= form_with model: @user do |form| %> <%= form.text_field :email %>
<%= form.submit %> <% end %>
データベースに保存する時、form_withの引数には
モデルクラスのインスタンスを指定します。
form_withは渡されたものによって、
行うHTTPメソッドとアクションをそれぞれ判断します。
form_with url:url_path
<%= form_with url: "users_path" do |form| %> <%= form.text_field :email %>
<%= form.submit %> <% end %>
pathに対してPOSTメソッドを行うので、
この例だと、users_pathに対してPOSTを行い、
params[:email]のような形でtext_fieldに入力された値を取得します。
form_with model: @model
モデルに入っているものに対して、2パターンの処理があります。
パターン1:新しく作られたものの場合
パターン2:既存のものを呼び出した場合
❏ パターン1(モデルに入っているのものが新しく作られたものの場合)
newアクションから渡ってきます。
def new
@user = User.new
end
<%= form_with model: @user do |form| # modelを渡している %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
このときRailsは@userの中身が空であると判断し、
createメソッドを呼び出すことを判断します。
def create
User.create(user_params)
end
private
# ストロングパラメータ
def user_params
paramas.requie(:user).permit(:email)
end
paramas.requie(:user).permit(:email)
の部分には注意です。
require(:user)のように一度userを呼んでいます。
❏ パターン2(既存のものを呼び出した場合)
editアクションから渡ってきます。
def edit
@user = User.find(params[:id]) # DBから既存のものを取得
end
<%= form_with model: @user do |form| # modelを渡している %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
このときRailsは@userの中身があると判断し、
updateメソッドを呼び出すことを判断します。
def update
User.find(params[:id]).update(user_params)
end
private
# ストロングパラメータ
def user_params
paramas.requie(:user).permit(:email)
end
超ざっくりしたまとめ
中身がある場合はupdate
中身がない場合はcreate
参考
【Rails】form_withの使い方を徹底解説! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
【Rails】form_with/form_forについて【入門】 - Qiita