我正在尝试在我的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类。任何帮助将不胜感激。
答案 0 :(得分:6)
在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
应用/ API / twilio / twilio.rb:强>
module API
class Twilio < Grape::API
prefix "twilio"
format :xml
get :hello do
{ text: 'Hello from Twilio' }
end
end
end
<强>配置/ routes.rb中:强>
mount API::Base => '/api'
重新启动rails服务器,你很高兴。此外,您应该可以轻松地从app / api / twilio和app / api / v1目录自动加载文件,因此您不必要求它们。
答案 1 :(得分:0)
我认为你的类名应该在与目录结构相同的结构下。哪个会给你:
class API::V1::Root
End
或者那些行中的东西。
(从我的手机......)
答案 2 :(得分:0)
我遇到了类似的错误,并通过要求类顶部的文件来解决它。即。
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/*"]