Rails: контроллер не может распознать класс из модуля / пространства имен - неинициализированная константа - PullRequest
1 голос
/ 26 февраля 2020

Я создал каталог для API logi c: app / api / EtherumAPI / V1 и поместил туда следующий код:

module EtherumAPI
    module V1
        class Request


            class << self
                def trancation
                end 
            end
        end 
    end
end

Зарегистрирован в моем application.rb:

config.autoload_paths << "#{Rails.root}/app/api"
config.eager_load_paths << "#{Rails.root}/app/api"

И попробуйте вызвать его внутри моего контроллера:

  def index
    @test = EtherumAPI::V1::Request
    @test.trancation
  end

Но я получил эту ошибку:

неинициализированная константа HomeController :: EtherumAPI

Я пробовал также что-то вроде «включить EtherumAPI :: V1», но это также не удалось. Как я могу это исправить и иметь возможность вызывать методы из класса Request?

1 Ответ

2 голосов
/ 26 февраля 2020

Прежде всего вы можете избавиться от:

config.autoload_paths << "#{Rails.root}/app/api"
config.eager_load_paths << "#{Rails.root}/app/api"

Все подкаталоги app по умолчанию являются путями автоматической загрузки. Изредка автозагрузчик «зависает» и не будет забирать новые добавленные каталоги. Обычно это можно исправить, перезапустив сервер rails и пружину ($ spring stop).

Здесь есть две проблемы. Во-первых, перегиб. Rails изменяет имена файлов из классов, верблюжая имя класса. К сожалению, это не работает автоматически для аббревиатур как ABC -> a_b_c.rb.

Таким образом, чтобы автозагрузчик искал EtherumAPI в etherum_api.rb, необходимо добавить перегиб:

# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'EtherumAPI'
end

Вторая проблема заключается в том, что имена модулей должны соответствовать фактическому пути к файлу. .

# app/api/etherum_api/v1/request.rb
module EtherumAPI
    module V1
        class Request
            class << self
                def trancation
                end 
            end
        end 
    end
end
...