Mountable Engines - неинициализированный постоянный клиент (NameError)

Я создал Mountable Engine после этого я создал файловый класс в lib.

Как это:

путь: /lib/dog.rb

класс:

    class Dog
      def initialize(breed, name)
      @breed = breed
      @name = name
    end

    def bark
      puts 'Ruff! Ruff!'
    end

    def display
      puts "I am of #{@breed} breed and my name is #{@name}"
    end
    end  

У меня есть инициализатор в /config/initializers/scheduler.rb с содержимым:

d = Dog.new('Labrador', 'Benzy')

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

uninitialized constant Dog (NameError)

Я попытался создать файл application.rb в /config/ с содержимым require '/lib/customer.rb' или require 'rails/all', но не работает.


person lolix    schedule 20.01.2016    source источник
comment
Уверен, вам нужно будет использовать EngineName::Dog.new("Labrador", "Benzy")   -  person j-dexx    schedule 20.01.2016
comment
Работает та же ошибка @j-dexx   -  person lolix    schedule 20.01.2016
comment
Похоже, что к моменту запуска инициализатора среда еще не настроена, поэтому рельсы еще не загрузили все файлы.   -  person j-dexx    schedule 20.01.2016
comment
@engineersmnky Я не могу использовать application.rb. Файл не загружается   -  person lolix    schedule 20.01.2016
comment
Извините, я забыл, что это двигатель. Ваша проблема в том, что вы просто требуете файл неправильно. Попробуйте добавить require 'dog', потому что lib будет считаться корнем для этого.   -  person engineersmnky    schedule 21.01.2016


Ответы (3)


Я столкнулся с той же проблемой, модули не загружались. Решил проблему, указав autoload_path в engine.rb

В движке lib/engien_name/engine.rb

class Engine < ::Rails::Engine
    config.autoload_paths += %W(#{config.root}/lib/modules)
end
person Deepak Kabbur    schedule 31.01.2016

Вы следовали руководству здесь? http://guides.rubyonrails.org/engines.html

Он говорит включить ваш класс как:

module Dog
  class Engine < ::Rails::Engine
  end
end

но я не верю, что это только ваш случай. Вам нужно выполнить несколько шагов, это не реализовано как обычная библиотека Ruby, которая просто включается.

person ftshtw    schedule 20.01.2016
comment
мой файл engine.rb по умолчанию: module Alarm class Engine < ::Rails::Engine isolate_namespace Alarm end end как добавить? - person lolix; 20.01.2016
comment
Я просмотрел руководство, на которое вы ссылались, но я думаю, что вы ошибаетесь. Код, который вы цитируете, является частью специфичного для Rails engine.rb, а не файлов, которые создает OP или я. Проблема, на которую ссылается OP, связана с тем фактом, что библиотеки внутри двигателей не загружаются автоматически по умолчанию (в отличие от основного приложения Rails). - person davew; 28.02.2020

Я столкнулся с этой же проблемой. Я нашел этот ответ полезным.

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

По указанной ссылке я нашел 2 решения для этого.

Вариант 1. Автозагрузка

Вы можете включить автозагрузку для папки lib вашего движка, отредактировав файл engine.rb вашего движка в файле lib. См. https://api.rubyonrails.org/classes/Rails/Engine.html (раздел Конфигурация).

В основном добавьте config.autoload_paths << File.expand_path("lib/some/path", __dir__) в ваш файл engine.rb. В моем случае, поскольку мои файлы находились в той же папке, что и файл engine.rb, я использовал config.autoload_paths << File.expand_path('.', __dir__)

Вариант 2. Требовать

Если вы хотите избежать изменения автозагрузки, вы можете потребовать файл там, где это необходимо. Просто добавьте require 'my_engine/class_or_module_needed' в начало нужного файла.

person davew    schedule 28.02.2020