使用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',我想要的是'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
下的所有路由。可能一个端点遮盖了另一个端点吗?
答案 0 :(得分:0)
评论时间太长,因此我将在这里拍照,并告诉我是否错误,然后删除答案。
我假设“ 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
这将避免冲突,以便可以通过“ api / v2”访问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中并避免任何冲突。