見出し画像

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

と記述してしまうと、以下のようにエラーが出てしまいます。

スクリーンショット 2019-12-05 1.30.44

デベロッパツールで生成されたhtmlフォームを見ると、form-control下は以下のような状態になっています。

スクリーンショット 2019-12-05 1.46.36

以下の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ファイルを確認すると、

スクリーンショット 2019-12-05 1.44.47

今度は正しいhtmlフォームが生成され、エラーが解決されました。

参考記事


この記事が気に入ったらサポートをしてみませんか?