Я новичок в 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-режима.
Что вы можете сделать, так это переместить 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
его.