Рельсы: неинициализированная константа NameError

Я новичок в Rails и пытаюсь создать собственный регистратор. Я поместил свой собственный класс регистратора в app/custom_logger/custom_log.rb следующим образом:

module CustomLogger
  class CustomLog
    def self.info
      puts 'called'
    end
  end
end

В моем AccountController (app/controllers/account_controller.rb) я пытаюсь использовать этот специальный регистратор:

class AccountController < ApplicationController
  def get
    CustomLogger::CustomLog.info
    render status: :ok
  end
end

Однако когда я отправляю запрос этому контроллеру, я получаю следующую ошибку:

uninitialized constant AccountController::CustomLogger

Я пробовал добавить include CustomLogger в app/controllers/application_controller.rb и использовать require_relative '../custom_logger/custom_log.rb', но ни один из этих подходов не сработал.

🤔 А знаете ли вы, что...
Ruby on Rails позволяет использовать компоненты фронтенда, такие как AngularJS или React, с помощью API-режима.


91
2

Ответы:

Что вы можете сделать, так это переместить custom_logger в папку lib (путь будет lib/custom_logger/custom_log.rb), которая предназначена для кода, который не вписывается в шаблон MVC.

после этого вам, вероятно, придется перезагрузить сервер, но здесь сработало.


Решено

С помощью этой файловой структуры app/custom_logger/custom_log.rb Zeitwerk ожидает, что вы определите CustomLog:

# root directory
#       |
# vvvvvvvvvvvvvvvvv
# app/custom_logger/custom_log.rb
#                   ^^^^^^^^^^
#                      |
class CustomLog # -----'
end

Структура файла должна соответствовать именам модулей/классов относительно корневого каталога . Rails автоматически настроит любой каталог непосредственно под app как корневой каталог, добавив его в autoload_paths.

Если вы хотите иметь CustomLogger::CustomLog, вам нужно создать дополнительный каталог в приложении, назовите его как хотите:

# root directory
#      |
# vvvvvvvvvvv
# app/loggers/custom_logger/custom_log.rb
#             ^^^^^^^^^^^^^ ^^^^^^^^^^
#                      |        |
module CustomLogger # -'        |
  class CustomLog   # ----------'
  end
end

https://guides.rubyonrails.org/autoloading_and_reloading_constants.html


Обратите внимание: вы не можете использовать этот регистратор во время загрузки приложения, что касается всего перезагружаемого кода (всего, что есть в autoload_paths). Вы можете настроить autoload_once_paths, если хотите использовать его в инициализаторе, или вы всегда можете поместить его в свой lib каталог и require его.

https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoloading-when-the-application-boots