自戒。
状況
deviseというGemを用いてユーザ登録機能を実装していた。
こいつはサインイン・サインアップまわりの一通りの機能を提供してくれる優れもので、当然そのためのビューも必要になる。
そこで、config/routes.rbの記述を以下の通りとした。
Rails.application.routes.draw do
root to: 'homes#top'
resources :users, only: [:index, :show, :edit]
devise_for :users
end
devise_forというのもdeviseが提供するメソッドで、usersに必要なルーティングを自動生成してくれる。
この場合でいえば、users/sign_inでサインイン、users/sign_upが新規登録画面でアクセスするわけだ。
...のはずだった。
問題
実際にアプリを起動し、users/sign_inにアクセスしてみる。
あれ...
ここ、users/show やないかい...
原因
これにはroutes.rbの仕様が絡んでくる。
実はroutes.rb内に書かれたルートは上から参照される。
これを踏まえて、もう一度記述を確認する。
Rails.application.routes.draw do
root to: 'homes#top'
resources :users, only: [:index, :show, :edit]
devise_for :users
end
二行目はルートパスの記述なので関係ないとして。
三行目、usersにindex, show, editの三つのアクションを設定しているのが確認できる。
ここでshowのリンク形式を確認してみよう。
user GET /users/:id(.:format)
...そう、原因はここにある。
users/sign_inのsign_inが:idだと誤認されることでshowに渡されていることが元凶だった。
解決
改善は簡単。
ルートファイルの記述順序を変えてあげるだけ。
Rails.application.routes.draw do
root to: 'homes#top'
- resources :users, only: [:index, :show, :edit]
- devise_for :users
+ devise_for :users
+ resources :users, only: [:index, :show, :edit]
end
まとめ
Rails、お手軽にWebが組めてたのしい。
