【问题标题】:How to add a Grape::API endpoint after one is already present?如何在一个已经存在的 Grape::API 端点之后添加一个?
【发布时间】:2019-06-14 13:44:43
【问题描述】:

我在使用Grape 时遇到了一个非常奇怪的问题。 该项目的结构不是最简单的,但仍然非常简单明了,我在 Rails 应用程序中有一个 app/api 文件夹,其中 API 类的结构或多或少像这样:

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

然后我在app/api/v2/ 下有几个类来完成他们的工作,分为控制器、模型、服务、验证器等,通常的东西。 遵循 Grape 官方文档,所有内容都“安装”在 config/application.rb 中(我不会重复,唯一改变的是文件夹的名称。

我必须添加另一个端点,而不是“api / v2” 987654328@ 类,更改前缀和其他一些小东西,+ 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 下没有任何内容。是否有可能一个端点遮蔽了另一个端点?

【问题讨论】:

    标签: ruby grape grape-api


    【解决方案1】:

    评论太长了,所以我要在这里拍一下,如果我错了,我会删除答案。

    我假设“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 
    

    这将允许您创建另一个命名空间(内部)“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(只是我的意见和经验)

    我们运行了很多 web 服务,我建议从一开始就在模块内对它们进行命名空间,以避免这些问题。 通常我们的多版本(单一职责)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 中并避免任何冲突。

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2018-10-07
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多