LoginSignup
0
0

More than 1 year has passed since last update.

[Rails] ルートの優先順位について

Posted at

自戒。

状況

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にアクセスしてみる。

image.png

あれ...
ここ、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

二行目はルートパスの記述なので関係ないとして。
三行目、usersindex, show, editの三つのアクションを設定しているのが確認できる。

ここでshowのリンク形式を確認してみよう。

 user GET    /users/:id(.:format)

...そう、原因はここにある。
users/sign_insign_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が組めてたのしい。

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