Railsでform_withでログインする
どうも、ひっきーです。現在ポートフォリオを製作中で、本日Deviseを使用しない&form_withを使ってログイン機能を実装したので、その注意点を残しておこうと思います。なお、基本的なログイン機能のセットアップはRailsチュートリアルの6~8章に沿って行なっております。
form_withはRails5.1から導入され、今後form_forとform_forは使用が非推奨になるそうです。私のRailsのバージョンは5.2なので、form_withを使用することができます。
form_withを使用する上での注意点は2点あります
1.デフォルトでAjaxが適応されているため、チュートリアルの実装では、ログイン失敗時のflashエラーメッセージが表示できない
2.sessionにパラメータを渡すときに、scope: :seesionで明示しなければパラメータが渡せない
1の注意点に関しては、デフォルトでremoto:trueとなっているため、form_withのコードににlocal:trueを記述することでAjaxが適応されなくなり、フラッシュメッセージを表示することができます。
2の注意点に関しては、
<%= form_with url:login_path, local: true do |f| %>
と記述してしまうと、以下のようにエラーが出てしまいます。
デベロッパツールで生成されたhtmlフォームを見ると、form-control下は以下のような状態になっています。
以下のRailsチュートリアルのコードと比較するとわかるように、sessionメゾットにemailとpasswordのパラメータが渡せていないことが分かります。
<input class="form-control" id="session_email"
name="session[email]" type="text" />
<label for="session_password">Password</label>
<input id="session_password" name="session[password]"
type="password" />
<input class="btn btn-primary" name="commit" type="submit"
value="Log in" />
form_withはscope オプションに指定した値が inputフィールドの name属性の値のプレフィックスになるそうなので、以下のようにscope: :sessionを記述します。
<%= form_with scope: :session, url:login_path, local: true do |f| %>
再びデベロッパツールからhtmlファイルを確認すると、
今度は正しいhtmlフォームが生成され、エラーが解決されました。
参考記事
この記事が気に入ったらサポートをしてみませんか?