1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails ルーティングの順序で失敗した件

Last updated at Posted at 2022-03-22

はじめに

JSONを返すRailsAPIを作成中に、意図しないコントローラーのアクションを読み取りに行ってしまった事があった。
エンドポイント(api/v1)を設定していた為、URI Pattern に被る部分が起きた為のミスだった。

状況

ディレクトリ構成

app/
 ├ contorollers/api/v1/articles/drafts_controller
   contorollers/api/v1/articles_controller

コントローラー

drafts_controller.rb
module Api::V1
  class Articles::DraftsController < BaseApiController
    def index
      ~
    end
    def show
      ~
    end
  end
end
articles_controller.rb
module Api::V1
  class ArticlesController < BaseApiController
    def index
      ~
    end
    def show
       ~
    end
  end
end

ルーティング

routes.rb
Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :articles
      namespace :articles do
        resources :drafts, only: [:index, :show]
      end
    end
  end
end

image.png

エラー内容

上記の状況で、drafts_controllerのindexアクションを実行しようとしたら、
意図せずarticles_controllerのshowアクションが実行されてしまった。

この2つはHTTPメソッドが同じGETであり、URI Pattern が上記画像の通り、
目的のindexがapi/v1/articles/drafts、期待してないshowがapi/vi/articles/:id
共通の部分が/api/v1/articles/である。

ルーティングの記述は上から順番に読み込む性質がある。なので、先に記述されてる/:idの部分をdraftで読み取ってしまった為、api/vi/articles/:idとしてarticles_controllerのshowアクションが実行されてしまったようだった。

解決策

シンプルにルーティングの順番を下記のように書き直したら、解決した。

routes.rb
Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      namespace :articles do
        resources :drafts, only: [:index, :show]
      end
      resources :articles
    end
  end
end

参考文献

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?