環境
Mac OS Catalina
Ruby 2.7.1
Rails 6.0.3.2
現象
ログイン機能用にdeviseを導入しrouteを設定。
その後、Rails routesを実行すると下記のエラーが出た。
Invalid route name, already in use: 'new_user_session' (ArgumentError)
You may have defined two routes with the same name using the `:as` option, or you may be overriding a route already defined by a resource with the same naming. For the latter, you can restrict the routes created with `resources` as explained here:
https://guides.rubyonrails.org/routing.html#restricting-the-routes-created
どうやら、'new_user_session'という名前のルートが既に使われているぞ!と言ってる様子。
現象発生時のルートは下記の通り。
routes.rb
Rails.application.routes.draw do
devise_for :users
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
root to: 'toppages#index'
resources :users, only: [:index, :show, :edit, :update, :destroy] do
member do
get :followings
get :followers
get :likes
end
end
devise_for :users,
path: '',
path_names: {
sign_up: '',
sign_in: 'login',
sign_out: 'logout',
registration: 'signup'
},
controllers: {
registrations: 'users/registrations',
sessions: 'users/sessions',
passwords: 'users/passwords'
}
devise_scope :user do
get 'signup', to: 'users/registrations#new'
get 'login', to: 'users/sessions#new'
get 'logout', to: 'users/sessions#destroy'
end
resources :posts, only: [:create, :destroy] do
collection do
get :search
end
end
resources :relationships, only: [:create, :destroy]
resources :favorites, only: [:create, :destroy]
end
解決方法
「2箇所定義とかしてないのにな〜」とか考えていましたが、ふと一番上に行が追加されていることに気づきましたw
devise_for :users の行を削除することで解決。
routes.rb
Rails.application.routes.draw do
root to: 'toppages#index'
resources :users, only: [:index, :show, :edit, :update, :destroy] do
member do
get :followings
get :followers
get :likes
end
end
devise_for :users,
path: '',
path_names: {
sign_up: '',
sign_in: 'login',
sign_out: 'logout',
registration: 'signup'
},
controllers: {
registrations: 'users/registrations',
sessions: 'users/sessions',
passwords: 'users/passwords'
}
devise_scope :user do
get 'signup', to: 'users/registrations#new'
get 'login', to: 'users/sessions#new'
get 'logout', to: 'users/sessions#destroy'
end
resources :posts, only: [:create, :destroy] do
collection do
get :search
end
end
resources :relationships, only: [:create, :destroy]
resources :favorites, only: [:create, :destroy]
end
無事、起動することができました!
最後に
already in use系のエラーは、今回と同様に同じルーティングが既に設定されていると考えて良さそうですね。
(そのままですが)
今後同じエラーが出た際は、サクッと解決できそう。