Структура каталогов Grape (неинициализированная постоянная ошибка)

Когда я пытаюсь запустить сервер, я получаю ошибку неинициализированной константы DasBoot :: API :: V1 (NameError). RubyMine распознает путь и не вызывает ошибок. Я перепробовал все, что было в моих силах, документацию прочитал, но безуспешно.

Project tree:
├── app
│   ├── api
│   │   └── dasboot
│   │       ├── api
│   │       │   ├── v1
│   │       │   │   └── standings.rb
│   │       │   └── v1.rb
│   │       ├── api.rb
│   │       └── grape.rb

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

require_relative 'grape'

module DasBoot
  class API < Grape::API
    mount DasBoot::API::V1
  end
end

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

class DasBoot::API::V1 < Grape::API
  version 'v1', using: :path, vendor: 'DasBoot'

  desc 'For testing API connection'
  get :hello do
    { message: 'Hello, sailor!' }
  end

  mount Standings
end

Конечная точка турнирной таблицы

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

class DasBoot::API::V1::Standings < Grape::API

  resource :standings do
    desc 'Fetch Standings'

    get '' do
      "#{ Time.now }"
    end
  end
end

routes.rb

...
mount DasBoot::API => '/api'
...

application.rb

...
    config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
...

person 11223342124    schedule 30.07.2017    source источник


Ответы (1)


Похоже на несоответствие в названии вашего модуля DasBoot и каталога dasboot.

В Rails мы используем CamelCase для именования модулей и классов в качестве соглашения. Если Rails встречает неизвестную ему константу, он использует метод underscore для имени константы и пытается найти соответствующий каталог snake_case для этой константы. В вашем примере ожидаемый каталог, содержащий ваш модуль «DasBoot», должен быть назван:

"DasBoot".underscore
=> "das_boot"

Таким образом, ожидается, что модуль DasBoot будет расположен в каталоге das_boot/. Но в соответствии со структурой каталогов, которую вы нам даете, ваш DasBoot модуль находится в каталоге dasboot (без _ посередине), поэтому Rails не может правильно его загрузить.

Если вы исправите это (либо переименовав свой модуль в Dasboot, либо каталог в das_boot), все должно работать нормально.

person Pierre-Adrien    schedule 13.03.2018