はじめに
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
エラー内容
上記の状況で、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