Почему я получаю сообщение «Невозможно выполнить постоянную автозагрузку» с Rails и grape?

#ruby-on-rails #ruby #grape

#ruby-на-рельсах #ruby #ruby-grape

Вопрос:

Я хочу создать API для приложения для Android. При поиске я нашел {grape} . Я следую этому руководству, но у меня возникла проблема с запуском сервера Rails:

 => Booting WEBrick
=> Rails 4.0.2 application starting in development on http://0.0.0.0:80
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport-4.0.2/lib/act
ive_support/dependencies.rb:464:in `load_missing_constant': Unable to autoload c
onstant Usuarios, expected C:/Sites/appCerca/app/api/v1/usuarios.rb to define it
 (LoadError)
 

Мой каталог:

 app
..api
....api.rb
....v1
......root.rb
......usuarios.rb
 

и файлы:

 #application.rb
module AppCerca
  class Application < Rails::Application
      config.paths.add "app/api", glob: "**/*.rb"
       config.autoload_paths  = Dir["#{Rails.root}/app/api/*"]
  end
end

#routes.rb
AppCerca::Application.routes.draw do
  mount API::Root => '/'
  [...]

#app/api/root.rb
module API
    class Root < Grape::API
        prefix 'api'
        mount API::V1::Root
    end
end

# app/api/v1/root.rb
module API
    module V1
        class Root < Grape::API
            mount API::V1::Usuarios
        end
    end
end

# app/api/v1/usuarios.rb
module API
    module V1
        class Usuarios < Grape::API
            version 'v1'
            format :json

            resource :usuarios do
                desc "Return list of authors"
                get do
                    Usuario.all
                end
            end
        end
    end
end
 

Почему я получаю эту ошибку? Я использую Ruby 1.9.3p484 и Rails-4.0.2.

Комментарии:

1. Не могли бы вы попробовать переименовать все API Api в свои файлы * .rb?

2. Я пробовал, но та же ошибка:

Ответ №1:

Попробуйте либо

  • Перемещение файлов вашего кода API из app/api в app/api/api или
  • Перемещение ваших классов API за пределы API модуля (т. Е. Удаление всех module API строк и соответствующих end им операторов).

Из документации Grape:

Поместите файлы API в app/api . Rails ожидает подкаталог, который соответствует имени модуля Ruby, и имя файла, которое соответствует имени класса. В нашем примере местоположение имени файла и каталог для Twitter::API должны быть app/api/twitter/api.rb .

Таким образом, правильное местоположение для вашего API::Root класса на самом деле будет app/api/api/root.rb .

С этим изменением ваш код запускается и отлично работает для меня на Rails 4.0.2.

Комментарии:

1. я последовал вашей рекомендации по второму варианту, поскольку мне не нужен api / api/, удалив «module API» во всех местах в / api, но он по-прежнему выдает ошибки «неинициализированной константы»

2. те же проблемы… Ожидается, что невозможно загрузить константу автоматически по умолчанию