Как добавить конечную точку Grape :: API после того, как она уже есть? - PullRequest
0 голосов
/ 14 июня 2019

У меня очень странная проблема с использованием Виноград .Структура проекта не самая простая, но все же довольно простая и понятная, у меня в приложении Rails есть папка app/api с классом API, более или менее структурированным следующим образом:

class Api < Grape::API
  prefix 'api/v2'
  ...
  mount V2::Controller::User
  ...
end

, тогда у меня естьнесколько классов под app/api/v2/, которые выполняют свою работу, разделены на контроллеры, модели, сервисы, валидаторы и так далее, обычные вещи.Все «смонтировано» в config/application.rb по официальной документации Grape (я не буду повторяться, единственное, что меняется, - это имя папок.

Я должен добавить другую конечную точку вместо «api / v2»Я хочу что-то вроде «api / internal» или как угодно, затем я следовал той же структуре, добавив класс app/api/internal_api.rb, который следует той же структуре класса Api, изменив префикс и некоторые другие второстепенные вещи, + конечные точкив app/api/internal. Я могу запустить rails c и выполнить InternalApi.new, результат будет таким, как ожидалось, и конечная точка в app/api/internal явно загружена. При запуске приложения, к сожалению, новая конечная точка не существует, и я неЯ не понимаю, почему у него такое поведение.

Я проверил ActiveSupport::Dependencies.autoload_paths и все в порядке, что еще я должен проверить и что может быть причиной этого? Я также установил https://github.com/syedmusamah/grape_on_rails_routes и показывает все маршруты в app/api/v2 и ничего в app/api/internal. Возможно ли, что одна конечная точка затеняет другую?

1 Ответ

0 голосов
/ 14 июня 2019

Слишком долго для комментария, поэтому я собираюсь сделать снимок здесь и сказать мне, если я ошибаюсь, и я удалю ответ.

Я предполагаю, что "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 и избегаете любых конфликтов.

...