LoginSignup
10
9

More than 5 years have passed since last update.

RubyonRailsで有名なdeviseを扱う上で気をつけたいroutes.rbの書き方

Last updated at Posted at 2018-03-01

RubyonRailsでdeviseを扱う上で気をつけたいこと

たまに、ルーティングが衝突してしまい、deviseのログイン画面が動かなくなる

まず、エラーが起きない書き方は以下です。

スクリーンショット 2018-03-01 20.07.32.png

次に、エラーが起きる書き方
スクリーンショット 2018-03-01 20.09.15.png

簡単に言えば、usersの記述よりもあとでdevise_for :usersを記述してしまうとエラーが起きる。

どんなエラーが起きるか

ログインできなくなる

スクリーンショット 2018-03-01 20.13.16.png

/users/sign_inでログインできなくなります
スクリーンショット 2018-03-01 20.14.59.png

とかスクリーンショット 2018-03-01 20.17.27.png

が出る。
他にも色々なエラーが考えられるが、とにかくログイン機能が動かなくなります

どうしてこのようなエラーが起きるか

routes.rbの順番って本当に大事です・・・
rake routesをしてルーティング設定を確認して見ましょう

まずdevise_for: usersの順番が正しいとき
スクリーンショット 2018-03-01 20.20.52.png

devise_for: usersの順番が間違っている時
スクリーンショット 2018-03-01 20.21.56.png

どこに変化があるかというと、usersコントローラーのルーティングと、deviseのルーティングの順番

今回起きているエラーは、users/:idというルーティングが、users/sign_inを包括してしまっているために起きるエラーです。
users/:idは、:idが変数として認識されるため、文字列だろうが数字だろうが、リクエストするURLがusers/〇〇になっていれば、users/:idのルーティングが動いてしまう。

つまり、users/sign_inをリクエストしても、users/:id(id = sign_in)として認識されてしまい、deviseのコントローラーが動かなくなってしまうのである。

実際にusers/:idが動いていて、id => sign_inとなっている

スクリーンショット 2018-03-01 20.17.27.png

エラー画面の、Requestを見てみると、{"id" => "sign_in"}となっている。
sign_inが、:idとして認識されてしまっていますね

devise_for :usersは先に書こう

今回のように、users/:idがusers/sign_inを包括してしまわないように、devise_for :usersを先に書くことでusers/sign_in の後に users/:idがルーティングとして動かす。

usersコントローラーがなければ順番に気を使う必要はないが、ある場合には気をつけないとエラーが起きます。

Requestのparametersを見ることも大事ですね。

10
9
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
10
9