#ruby-on-rails #eager-loading
Вопрос:
Я пытаюсь повторно загрузить различные файлы ruby. Насколько я понимаю, это должно позволить вызывать классы, определенные в этих модулях, в других местах приложения без необходимости использования «требуется имя файла» перед вызовом. Исходные файлы хранятся в каталоге ‘lib’, который был добавлен в page_load_paths со следующей строкой в gps_monitor/application.rb
config.eager_load_paths lt;lt; Rails.root.join("lib")
Урезанная версия файла, который я пытаюсь использовать, находится в gps_monitor/lib/production_key_generator.rb
require "rails/generators" module Rails module Generators class ProductionKeyGenerator lt; Base # :nodoc: def self.hello "In Hello" end def initialize @key = "secret-key" end end end end
Затем я вызываю консоль rails и пытаюсь получить доступ к классу…
sol:gps_monitor sjf$ rails console Running via Spring preloader in process 68735 Loading development environment (Rails 6.1.4.1) irb(main):001:0gt; res = Rails::Generators::ProductionKeyGenerator.new (irb):1:in `lt;maingt;': uninitialized constant Rails::Generators (NameError) Did you mean? Enumerator irb(main):002:0gt; require 'production_key_generator' /Users/sjf/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/zeitwerk-2.5.1/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded': expected file /Users/sjf/TickProjectNG/tick_playbook/apps/gps_monitor/lib/production_key_generator.rb to define constant ProductionKeyGenerator, but didn't (Zeitwerk::NameError) irb(main):003:0gt; res = Rails::Generators::ProductionKeyGenerator.new =gt; #lt;Rails::Generators::ProductionKeyGenerator:0x00007ff65fc73b18 @key="secret-key"gt; irb(main):004:0gt;
При первой попытке была выдана ошибка «неинициализированные постоянные рельсы::Генераторы (ошибка имени)». Так что, очевидно, файл не был загружен с нетерпением, как предполагалось.
Поэтому я попытался запросить файл, в результате чего появилось сообщение о том, что файл не содержит класса, который он, очевидно, содержит.
Однако попытка доступа к классу после «требуется» была успешной.
Я подозреваю, что происходит то, что нетерпеливая загрузка не выполняется из-за сообщения об ошибке, но после того, как это потребуется вручную, вы сможете получить доступ к классу.
Так почему же он говорит мне, что именованный файл не содержит именованного класса?
Ответ №1:
Ответ заключается в том, что файл, определяющий Rails::Generators::ProductionKeyGenerator, должен находиться в папке «lib/rails/generators», а не просто «lib».
Сообщение об ошибке было правильным. «gps_monitor/lib/production_key_generator.rb для определения постоянного ProductionKeyGenerator, но не»
Он не определил «ProductionKeyGenerator», он определил рельсы::Генераторы::ProductionKeyGenerator. Поэтому он должен был быть в «lib/rails/генераторах», чтобы определить правильный класс.
Легко, как только вы это увидите!