RubyonRailsでdeviseを扱う上で気をつけたいこと
たまに、ルーティングが衝突してしまい、deviseのログイン画面が動かなくなる
まず、エラーが起きない書き方は以下です。
簡単に言えば、usersの記述よりもあとでdevise_for :usersを記述してしまうとエラーが起きる。
どんなエラーが起きるか
ログインできなくなる
が出る。
他にも色々なエラーが考えられるが、とにかくログイン機能が動かなくなります
どうしてこのようなエラーが起きるか
routes.rbの順番って本当に大事です・・・
rake routesをしてルーティング設定を確認して見ましょう
どこに変化があるかというと、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となっている
エラー画面の、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を見ることも大事ですね。