form_withでモデルを記載した時、つまりform_forで書いた時のメリットがイマイチ分からなかったので、簡単にまとめてみました。
モデルの存在有無で自動的にcreateかupdateに振り分けてくれる
form_with model:@user
とした時に@user
が既に存在していればusersコントローラのupdateに、存在していなければcreateアクションに指定せずとも勝手にとんでいきます。
もし特定のアクションにとばしたい場合はurlを指定してください。
paramsがモデルに紐づいた形式になる
アクションが受け取るparamsがparams[:user][:email]
とかparams[:user][:name]
などになるので、ユーザー情報を更新したい時などは一々全部書かなくてもparams[:user]
だけで全部Getできる。
sample.rb
# form_with url:user/create(form_tag)で取得した場合
def create
user = User.new(name: params[:name], email: params[:email])
user.save
end
# form_with model:@user (form_for)で取得した場合
def create
user = User.new(params[:user])
user.save
end
ただ、上記はストロングパラメータをガン無視していますので、実際には上記のような使い方はできません。
おまけ
ストロングパラメータを使うと下記の様になります。
sample.rb
# form_with url:user/create(form_tag)で取得した場合
def create
user = User.new(user_params)
user.save
end
private
def user_params
params.permit(:name, :email)
end
# form_with model:@user (form_for)で取得した場合
def create
user = User.new(user_params)
user.save
end
private
def user_params
params.require(:user).permit(:name, :email)
end
なんか記述量が増えてしまった。。。
ただ、HTML側の記述量はcreateとupdateで場合わけしない分減るので、全体としてはコード量は減るんですかね。他のメリットデメリットを知っている方いたら教えていただけると幸いです。