自戒。
状況
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が組めてたのしい。