inf
@inf
DevOps Engineer

Что можно сделать с автозагрузкой /lib?

Какое-то странное поведение рейлс.
Есть роут
namespace :api do
    namespace :v1 do
      get 'roistat/calls', to: 'roistat#calls'
    end
  end

Есть контроллер
class Api::V1::RoistatController < ActionController::Base

  def calls
    render :ok
  end
end

Пинаем его, и видим:
Started GET "/api/v1/roistat/calls" for 127.0.0.1 at 2018-05-18 09:19:54 +0300

LoadError (Unable to autoload constant Api, expected /path/to/project/lib/roistat/api.rb to define it):
  activesupport (4.2.7.1) lib/active_support/dependencies.rb:495:in `load_missing_constant'
  activesupport (4.2.7.1) lib/active_support/dependencies.rb:184:in `const_missing'

Казалось бы... причём тут /lib ?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
inf
@inf Автор вопроса
DevOps Engineer
Какой-то баг с автолоадом модулей из /lib (примерно как тут https://github.com/thoughtbot/factory_bot/issues/670)
Проще всего оказалось переименовать /lib/roistat/api.rb в /lib/roistat/client.rb
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gururuby
@gururuby
Ruby-разработчик
Проверьте нет ли у вас одинаковых названий модулей и классов, вполне возможно что rails некорректно разруливает зависимости.
И я бы предпочел структуру
module Api
  module V1
     class RoistatController < ActionController::Base
     end
  end
end
Ответ написан
Комментировать
etspring
@etspring
Начитанное быдло
Я таки конечно извиняюсь, но не лучше ли сделать:
scope :api do
    namespace :v1 do
      get 'roistat/calls', to: 'roistat#calls'
    end
end


P.S: и ваще мне кажецо, что это происки буков ;)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы