LoginSignup
0
0

More than 3 years have passed since last update.

form_withでのredirect_toについて

Posted at

初めに

ポートフォリオを改善しようとコード弄っていたところ、form_forを使ったままの記載を発見。
form_withに書き換えたろ、安易な考え。。。

※ 本内容は以下の記事を参考にさせて頂き、問題を解決・記事を書くことにしました。
https://qiita.com/Ryoga_aoym/items/ac2918259744da128e86

開発環境

ruby 2.5.1p57
rails (6.0.3.1)

何が起きたか

Image from Gyazo

簡単な入力フォームを作成、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を追記した。

終わりに

スクールで習った気がするーという内容でしたが、いざ、体感すると忘れている物でした。。。
初めて記事投稿するので、マナー違反や解釈の誤り、改善あれば教えて頂ければ幸いです。

ありがとう御座いましたー。

0
0
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
0
0