事象
以下のURLにGETすると期待した動きにならない。
http://localhost:3000/admin/adminlist
期待する動き: admins#index が呼ばれる
実際の動き: admins#edit が呼ばれる
なんで こうなるのよ!!!
ActiveRecord::RecordNotFound - Couldn't find Admin with 'id'=adminlist:
activerecord (4.2.5) lib/active_record/core.rb:155:in `find'
app/controllers/admins_controller.rb:116:in `set_admin_company'
activesupport (4.2.5) lib/active_support/callbacks.rb:432:in `block in make_lambda'
activesupport (4.2.5) lib/active_support/callbacks.rb:145:in `block in halting_and_conditional'
activesupport (4.2.5) lib/active_support/callbacks.rb:504:in `block in call'
ログを見ると id=adminlist でselectしている
↓
調査すると admin#edit が呼ばれている
(edit時はselectしている)
↓
なぜ #edit が呼ばれる?
↓
routes.rbを確認
routus.rb
scope :admin do
# 管理者マイページ
get '/' => 'admins#my_page'
# 管理者ログインページ
get 'login' => 'admin_sessions#new'
# 管理者ログアウト
get 'logout' => 'admin_sessions#destroy'
# 管理者アカウント編集
get ':id' => 'admins#edit'
# 管理者アカウント一覧
get 'adminlist' => 'admins#index'
end
いろいろviewやらリンクやらmethodやら確認したが悪くなさそう。。
行き着いた結果
↓
routus.rb が悪い!!!
以下のように変更して解決
routus.rb
scope :admin do
# 管理者マイページ
get '/' => 'admins#my_page'
# 管理者ログインページ
get 'login' => 'admin_sessions#new'
# 管理者ログアウト
get 'logout' => 'admin_sessions#destroy'
- # 管理者アカウント編集
- get ':id' => 'admins#edit'
# 管理者アカウント一覧
get 'adminlist' => 'admins#index'
+ # 管理者アカウント編集
+ get ':id' => 'admins#edit'
end
バグの原因
ルーティングは上から順番に検索されるようで、
get ':id' => 'admins#edit'
この一行が悪さをしておりました。
このルーティン以下の
get 'adminlist' => 'admins#index'
は、#edit の params[:id] として扱われてしまい、
id=adminlist となっておりました。
とりあえず、一番下に移動して期待通りの動きになりました。
独自ルーティンでハマっている方がこの記事を見つけて解決になれば幸いです。