Rails – レンダリングされない~form_with

概要

Rails事始めで、フォームから送信した内容を反映させるだけのことが「ページがレンダリングされない」という状態になった話。

結論はfome_withの機能とパラメーターに関するもので、オンラインレッスンの講師の方に教わるまで解決できなかった。

問題の内容

アプリケーション

フォームから受け取った値をインスタンス変数に入れて、それを他のアクションで参照してフォームがあるページを更新するという内容。

躓いてから、できるだけシンプルにしていったのが次のアプリケーションで、フォームのボタンを押すとトップページのテキストの内容を入れ替えるだけのもの。

コントローラー:app/controllers/pages_controller.rb

ビュー:app/views/pages/top.html.erb

ルーティング:config/rotes.rb

症状

以下のページが表示されるが、Submitボタンを押しても画面に変化がない。

よく見ると、inputにルーティングしているのにURLに/inputがついていない。

検証ツールで見ると、inputに対して通信はしていて、書き換えの処理はされているようだ。

コンソールの出力を見ると、POST時の変数の内容は”Hi”に変更されている。

解決

解決策は”form_withのパラメーターにlocal: trueを加える”というものだった。

<%= form_with(url: input_path, local: true) do %>

コントローラー:app/controllers/pages_controller.rb

Submitボタンを押すと表示が変更されるようになった。

理由

form_forでは送信時にページ全体がレンダリングされるが、form_withはデフォルトではajaxによる送信となっていて、そのままではページがレンダリングされない。

パラメーターにlocal: trueを指定するとHTMLとしてのフォーム送信として扱われ、ページがレンダリングされる。

form_tag/form_withがdeprecatedだというところだけを読んで気軽に使ったのが敗因。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です