Рельсы: неинициализированная константа 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', но ни один из этих подходов не сработал.

либо добавьте app/custom_logger в пути активной загрузки в вашей конфигурации, либо переместите customer_logger в раздел app/models/concerns. Загрузчик классов не знает, что вы создали новую папку в приложении.

dbugger 02.08.2024 23:46

Это мило. Но это ни в коем случае не логгер. В Ruby базовый интерфейс для регистраторов предоставляется классом Logger . Rails предоставляет улучшенную версию ActiveSupport::Logger. Вы также НЕ хотите автоматически загружать регистратор, если хотите иметь возможность использовать его, например, в инициализаторах.

max 03.08.2024 21:27

Zeitwerk ожидает, что путь будет «app/custom_logger/custom_logger/custom_log.rb» в зависимости от вложенности вашего модуля.

engineersmnky 03.08.2024 23:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Rails, по крайней мере текущие версии, автоматически загружают любые файлы в папках папки приложения. Просто перезагрузите приложение.

Ben Trewern 03.08.2024 17:08
Ответ принят как подходящий

С помощью этой файловой структуры 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

Другие вопросы по теме