Output Diary

プログラミング × 読書 のアウトプットを発信しています

【Rails】form_withについて

f:id:kina_kq:20210425125010j:plain

 

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アクションから渡ってきます。

app/controllers/users_controller.rb
 
def new
  @user = User.new
end
app/views/users/new.html.erb
 
<%= form_with model: @user do |form| # modelを渡している %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

 

このときRails@userの中身が空であると判断し、

createメソッドを呼び出すことを判断します。

 

app/controllers/users_controller.rb
 
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アクションから渡ってきます。

app/controllers/users_controller.rb
 
def edit
  @user = User.find(params[:id]) # DBから既存のものを取得
end
app/views/users/edit.html.erb
 
<%= form_with model: @user do |form| # modelを渡している %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

 

このときRails@userの中身があると判断し、

updateメソッドを呼び出すことを判断します。

 

app/controllers/users_controller.rb
 
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