我尝试在 Rails 应用程序中安装两个 API——一个名为“v1”,另一个名为“twilio”。每个 API 将由多个文件组成,因此我希望每个文件都有自己的文件夹。在我的 app/api 目录中,我有 2 个文件夹——“v1”和“twilio”——以及一个名为“api.rb”的文件,我试图用它来挂载两个 api。其内容是:
module API
class V1 < Grape::API
prefix "api"
format :json
mount API::Root => '/v1'
end
class Twilio < Grape::API
prefix "twilio"
format :xml
mount API::Twilio_API => '/twilio'
end
end
在“v1”目录中,我有一个名为“root.rb”的文件,其开头如下:
module API
class Root < Grape::API
version 'v1', :using => :header
...
在“twilio”目录中,我有一个名为“twilio_api.rb”的文件,其开头为:
module API
class Twilio_API < Grape::API
version 'v1', :using => :header
...
我的路线文件有:
mount API::V1 => "/"
mount API::Twilio => "/"
当我启动 Rails 服务器时,我收到错误:
`load_missing_constant': Expected [My rails app]/app/api/v1/root.rb to define Root (LoadError)
我不明白这一点,因为 root.rb 确实定义了 Root 类。任何帮助将不胜感激。
在 Grape 中,您可以在另一个 API 中挂载多个 API。这意味着您可以为您的 API 创建一个“基”类,并将所有其他类挂载到其中。
文件结构:
app/
api/
v1/
v1_api.rb
twilio/
twilio_api.rb
api.rb
应用程序/api/api.rb:
require 'v1/v1_api'
require 'twilio/twilio_api'
module API
class Base < Grape::API
mount API::V1
mount API::Twilio
end
end
应用程序/api/v1/v1_api.rb:
module API
class V1 < Grape::API
prefix "v1"
format :json
get :hello do
{ text: 'Hello from V1' }
end
end
end
app/api/twilio/twilio.rb:
module API
class Twilio < Grape::API
prefix "twilio"
format :xml
get :hello do
{ text: 'Hello from Twilio' }
end
end
end
config/routes.rb:
mount API::Base => '/api'
重新启动 Rails 服务器,就可以开始了。此外,您应该能够轻松地从 app/api/twilio 和 app/api/v1 目录自动加载文件,因此您不必需要它们。
我认为它期望您的类名位于与目录结构相同的结构下。这会给你:
class API::V1::Root
End
或者类似的东西。
(来自我的手机...)
我有一个类似的错误,并通过要求类顶部的文件来解决它。即
require 'root'
require 'twilio'
在 api.rb 中
在 Grape API 中,有自动加载文件名的说明,不确定这是否已完成或对您有帮助:
Place API files into app/api and modify application.rb.
config.paths.add "app/api", glob: "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
将此代码添加到 app/config/initializers/inflections.rb 中
ActiveSupport::Inflector.inflections(:en) 做 |inflect| inflect.acronym 'API' 结束