初めに
ポートフォリオを改善しようとコード弄っていたところ、form_forを使ったままの記載を発見。
form_withに書き換えたろ、安易な考え。。。
※ 本内容は以下の記事を参考にさせて頂き、問題を解決・記事を書くことにしました。
https://qiita.com/Ryoga_aoym/items/ac2918259744da128e86
開発環境
ruby 2.5.1p57
rails (6.0.3.1)
何が起きたか
簡単な入力フォームを作成、createを押下すると情報が登録できる
form_forの場合では以下の記載で実装
= form_for @target do |f|
省略
= f.submit "Create"
これを書き換えて以下の記載でform_withに変更
= form_with model: @target do |form|
省略
= f.submit "Create"
ところが
書き慣れている人なら当たり前なのかもですが、submit押下時のページ遷移(redirect_to)が動作せず。
データは保存されているが、何度もcreateを押下出来るので同じ内容が増殖。
createの処理
def create
@target = Target.new(target_params)
if @target.save
redirect_to root_path
else
render :new
end
end
原因調査
とりあえず、binding.pry → 停止したため、正常動作。
save
def create
@target = Target.new(target_params)
if @target.save
binding.pry
redirect_to root_path
else
render :new
end
end
パターン2、binding.pry → 停止したがredirect_toが動作していれば停止しないはず。
redirect_toが動作していないと推測。
def create
@target = Target.new(target_params)
if @target.save
redirect_to root_path
binding.pry
else
render :new
end
end
あとはgoogleで検索あるのみ。
結果
form_withのオプション抜けが原因。
動作するように記載すると以下になった。
= form_with model: @target, local: true do |form|
省略
= f.submit "Create"
原因としてはform_withではajax通信でformを送信。
そのajaxを使ってformを送信すると送信先のコントローラーで実行されるredirect_toの挙動にturbolinksが関わってくる。
そして、自分はturbolinksを入れていないため動作しなかった、ということらしい。
解決方法は二つあり、turbolinksを導入するかajax通信を切るかの二択で自分はajax通信を切るためにlocal: trueを追記した。
終わりに
スクールで習った気がするーという内容でしたが、いざ、体感すると忘れている物でした。。。
初めて記事投稿するので、マナー違反や解釈の誤り、改善あれば教えて頂ければ幸いです。
ありがとう御座いましたー。