Нетерпеливая загрузка модулей ruby в Rails 6

#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/генераторах», чтобы определить правильный класс.

Легко, как только вы это увидите!