LoginSignup
5
5

More than 5 years have passed since last update.

ルーティングではまったので。。。

Last updated at Posted at 2016-02-25

事象

以下のURLにGETすると期待した動きにならない。
http://localhost:3000/admin/adminlist

期待する動き: admins#index が呼ばれる

実際の動き: admins#edit が呼ばれる

なんで こうなるのよ!!!:anger:

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 となっておりました。

とりあえず、一番下に移動して期待通りの動きになりました。

独自ルーティンでハマっている方がこの記事を見つけて解決になれば幸いです。

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