はじめに
Rails Turorial等でユーザー登録機能、ログイン機能を実装する際にform_forで書かれていました。
しかしRails5.1以降ではform_forではなくform_withを使うことが推奨されているので、そっくりそのまま変えてみたのですがエラーが出てしまいました。
なのでこれからform_withを使いたいけどform_forしか使い方が分からないという人のために私がつまづいた事、そしてその改善点を載せておきます。
ユーザー登録機能
Rails Turorialではユーザーを登録する際form_forを使って以下のように記述されてます
<%= form_for(@uesr) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
これをform_withに変えても ArgumentError が出てしまいます。
原因はform_forではUserモデルが存在する場合自動的に@userに対してモデルを割り振られていましたがform_withではこちらが指定しないといけないためエラーとなってしまいます。
<%= form_with(model: @uesr) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
renderのflash
ユーザー登録をした時にflashでメッセージを出そうとした時にredirect_toの成功のメッセージは表示されるが、renderの失敗の文字が表示されなくなりました。
原因はform_withはデフォルトで非同期通信となっていたため。
引数にlocal: trueを記入すると非同期通信がオフとなる。
<%= form_with(model: @uesr, local: true) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
ログイン機能
<%= form_for(:session, url: login_path) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
ユーザー登録機能の時と同様にform_withに変えても ArgumentError が出てしまいます。
原因は:sessionに対して何も指定していないから。
(すみません、対処法がわかってもなぜ必要なのかがわかりませんでした。わかる方がおられたら教えていただけたら嬉しいです。)
<%= form_with(scope: :session, url: login_path) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
まとめ
自分の勉強のまとめとこれから勉強する人のやくに立てればと思いましたので今回初投稿してみました。
間違っているところ等ございましたら連絡よろしくお願いします。
参考
- [Rails 5.1] ‘form_with’ APIドキュメント完全翻訳
https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502 - 【Rails 5】(新) form_with と (旧) form_tag, form_for の違い
https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2