在 Rails 中安装多个 Grape API 时遇到问题

问题描述 投票:0回答:4

我尝试在 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 类。任何帮助将不胜感激。

ruby-on-rails ruby module rack grape-api
4个回答
7
投票

在 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 目录自动加载文件,因此您不必需要它们。


0
投票

我认为它期望您的类名位于与目录结构相同的结构下。这会给你:


class API::V1::Root
End

或者类似的东西。

(来自我的手机...)


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/*"]

0
投票

将此代码添加到 app/config/initializers/inflections.rb 中

ActiveSupport::Inflector.inflections(:en) 做 |inflect| inflect.acronym 'API' 结束

© www.soinside.com 2019 - 2024. All rights reserved.