可安装引擎 - 未初始化的常量Customer(NameError)

时间:2016-01-20 11:38:23

标签: ruby-on-rails ruby rails-engines

之后我在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)

我尝试在/ config /中使用内容require '/lib/customer.rb'require 'rails/all'创建一个application.rb文件,但不起作用。

3 个答案:

答案 0 :(得分:1)

你有没有按照这里的指南? http://guides.rubyonrails.org/engines.html

它说要将你的课程包括在内:

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

但我不相信这只是你的情况。您需要执行几个步骤,它不是作为简单包含的普通Ruby库实现的。

答案 1 :(得分:0)

我遇到了同样的问题,模块没有加载。通过在engine.rb

中指定autoload_path解决了该问题

在引擎 lib / engien_name / engine.rb

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

答案 2 :(得分:0)

我遇到了同样的问题。我发现this的答案很有帮助。

基本上,您遇到的问题是由于lib并未像主Rails应用中的lib那样自动加载到引擎中。

从引用的链接中,我找到了两种解决方案。

选项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'添加到所需文件的顶部即可。