之后我在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文件,但不起作用。
答案 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'
添加到所需文件的顶部即可。