Слишком долго для комментария, поэтому я собираюсь сделать снимок здесь и сказать мне, если я ошибаюсь, и я удалю ответ.
Я предполагаю, что "API" - это "app / api /api.rb "(или для этого), и именно здесь монтируется" v2 ".
Учитывая ваш текущий дизайн, я бы рекомендовал переместить все ваши V2
монтирования в новый V2
класс API с пространством именнапример.("app / api / v2 / api.rb")
module V2
class API < Grape::API
version 'v2', using: :path
mount V2::Controller::User
#....
end
end
Это позволит вам затем создать другое пространство имен (Internal) "app / api / internal / api.rb"
module Internal
class API < Grape::API
# mount Internal::Controller::User
end
end
Затем измените существующее, чтобы просто смонтировать их:
class Api < Grape::API
prefix 'api'
mount V2::API
mount Internal::API => '/internal'
end
Это позволит избежать конфликтов, чтобы v2 был доступен через «api / v2», а внутренний - через «api / internal» (вымог бы даже взять это дальше и версию, которая, если бы вы захотели)
TL; DR (Только мое мнение и опыт) * 1020 *
У нас много веб-сервисов, и я быво избежание этих проблем рекомендуется с самого начала рекомендовать пространство имен внутри модулей.Как правило, наши структуры каталогов API с несколькими версиями (с одной ответственностью) выглядят следующим образом:
app
api
api
common
v1
[lots of other files]
base.rb
v2
[lots of other files]
base.rb
base.rb
Это позволит вам подключить все ваши конечные точки в "api / api / base.rb" примерно так:
module API
class Base < Grape::API
prefix 'api'
mount V1::Base
mount V2::Base
end
end
Таким образом, когда вам нужна новая структура, вы строите ее в своем собственном модуле и просто монтируете ее в API :: Base и избегаете любых конфликтов.