0

我正在尝试为版本化 api(rails-grape) 调用版本特定的类并得到错误

 NameError (uninitialized constant API::V1::XMLResponses):
09:23:36 web.1     |   app/api/v1/base.rb 

我的目录结构

app/
  api/
    v1/
      xmlresponses/
         phonebook.rb   
      api.rb
    v2/
      xmlresponses/ 
      api.rb
    api.rb

api.rb 需要'v1/base.rb' 需要'v2/base.rb'

module  API
  class Base < Grape::API
    mount API::V1 => '/'
    mount API::V2 => '/v2/'
  end
end

在 v1/base.rb 我访问这个版本的 api 的类

V1::XMLResponses::电话簿::getall()

拜托,你能告诉我为什么会出现这个错误吗?

感谢您的回答,我创建了简单的应用程序来演示它是如何完成的https://github.com/Asmmund/grape_versioning

4

1 回答 1

2

这可能只是您的模块结构中有问题。也许是失踪了require

我会写这样的东西:

/foo
  v1/
  |_ responses/
  |  |_ time.rb
  |
  |_ base.rb

  v2/
  |  
  |_ base.rb

  api.rb
  config.ru

文件:

# api.rb`

require 'grape'
require './v1/base.rb'
require './v2/base.rb'

module FooBar
  module API
    class Base < Grape::API
      mount API::V1 => '/'
      mount API::V2 => '/v2/'
    end
  end
end


# v1/base.rb
require_relative './responses/time.rb'

module FooBar
  module API
    class V1 < Grape::API
      get 'foo' do
        "foo"
      end
      get 'time' do
        API::Responses::Time.api_time
      end
    end
  end
end

# v1/responses/time.rb
module FooBar
  module API
    module Responses
      class Time
        def self.api_time
          "API time"
        end
      end
    end
  end
end

# v2/base.rb
module FooBar
  module API
    class V2 < Grape::API
      get 'bar' do
        "bar"
      end
    end
  end
end

然后在config.ru

# config.ru
require './api.rb'
run FooBar::API::Base

运行:

thin start
...
curl 0.0.0.0:3000/foo
=> foo
curl 0.0.0.0:3000/v2/bar
=> bar
curl 0.0.0.0:3000/time
=> API time
于 2013-11-17T11:00:12.930 回答