Grape::API — Невозможно автоматически загрузить константу Base, ожидается, что /app/api/v1/base.rb ее определит (LoadError)

Мне нужна помощь, чтобы настроить и запустить Grape::API с Rails 4. Я получаю Unable to autoload constant Base, хотя puts говорит мне, что класс загружен. Что я делаю неправильно?

приложение/api/api.rb

class API < Grape::API
  prefix 'api'
  format :json
  default_format :json
  mount V1::Base   # Everything loads perfectly until I add this line.
end

приложение/api/v1/base.rb

module V1
  class Base < API
    puts "=== DEBUG - in Base"
    version 'v1', using: :path, vendor: 'orwapp', cascade: false

    mount Users

  end
end

$ rspec spec/api

12:58:29 - INFO - Run all
12:58:29 - INFO - Running all specs
=== DEBUG - in Base
/dependencies.rb:481:in `load_missing_constant': 
Unable to autoload constant Base,
 expected /Users/martins/Work/myapp/app/api/v1/base.rb to define it (LoadError)
        from /Users/martins/Work/myapp/app/api/api.rb:9:in `<class:API>'
        from /Users/martins/Work/myapp/app/api/api.rb:3:in `<top (required)>'

spec/api/users_spec.rb

describe 'GET /api/v1/users/:id', focus: true do
  let(:user) { Fabricate :user }

  it 'returns that specific user' do
    get "/api/v1/users/#{ user.id }", {}, https_and_authorization
    response.status.should eq 200
    parse_response_for(:user)['email'].should eq user.email
  end
end

Версии, которые я использую

$ ack grape Gemfile.lock
      remote: git://github.com/intridea/grape.git
        grape (0.9.1)
        grape-entity (0.4.4)
        grape-swagger (0.8.0)
          grape
          grape-entity

person martins    schedule 10.09.2014    source источник


Ответы (2)


Попробуйте наследовать Base от Grape::API вместо API:

module V1
  class Base < Grape::API
  ...

Унаследовав его от API, вы создаете циклическую зависимость: интерпретатор не может знать определение V1::Base, пока не узнает определение API, но для этого ему сначала нужно знать определение V1::Base и так далее.

person Community    schedule 10.09.2014
comment
Спасибо за предложение. Впрочем, это не имело никакого значения. У меня нет проблем с циклическими зависимостями. Я получаю сообщение об ошибке Невозможно автоматически загрузить постоянную базу - person martins; 10.09.2014

Изменение на mount ::V1::Base исправило это.

person martins    schedule 11.09.2014