【发布时间】:2020-03-10 09:06:41
【问题描述】:
我正在尝试制作一个 Ruby on Rails 引擎,并且我希望初始化程序能够访问帮助程序和模型。
我将在下面写一个示例、部分代码以及我遇到的错误。这可能不是推荐的方式,因为我可以看到在某些情况下我在重复自己,但这是我制作的第一个引擎。
文件 lib/my_engine/engine.rb
module MyEngine
require 'my_engine/functions'
class Engine < ::Rails::Engine
isolate_namespace MyEngine
config.autoload_paths += %W( #{config.root}/lib )
end
class GlobalVars
attr_accessor :foo
def initialize
@foo = MyEngine::Functions.new
end
end
class << self
mattr_accessor :GLOBAL
mattr_accessor :USER_CONFIG
self.GLOBAL = MyEngine::GlobalVars.new
# add default values of more config vars here
self.USER_CONFIG = 'default config'
end
def self.setup(&block)
yield self
end
end
文件 lib/my_engine/functions.rb
module MyEngine
require '../../app/helpers/my_engine/options_helper'
class Functions
include MyEngine::OptionsHelper
attr_accessor :some_link
def initialize
@some_link = get_option('dummy')
end
end
end
app/controllers/my_engine 中还有一个名为 OptionsController 的控制器,app/helpers/my_engine/options_helper.rb 中还有一个名为 OptionsHelper 的控制器:: p>
module MyEngine
module OptionsHelper
def get_option(name)
MyEngine::Option.new
end
end
end
当我尝试运行虚拟应用程序时,出现此错误:
/app/helpers/my_engine/options_helper.rb:4:in `get_option': uninitialized constant MyEngine::Option (NameError)
如果我更改为 Option.new,则会出现此错误:
/app/helpers/my_engine/options_helper.rb:4:in `get_option': uninitialized constant MyEngine::OptionsHelper::Option (NameError)
对于::MyEngine::Option.new,我有:
/app/helpers/my_engine/options_helper.rb:4:in `get_option': uninitialized constant MyEngine::Option (NameError)
对于::Option.new,我有:
/app/helpers/my_engine/options_helper.rb:4:in `get_option': uninitialized constant Option (NameError)
虚拟应用程序中没有任何内容。上面定义的所有助手和模型都在引擎中。
在此之前,我遇到了其他错误,因为它无法访问帮助程序或 Functions 类。即使将它们放在同一目录中,我也必须添加 require 和 include 才能使其工作。此外,为了工作,我必须将 GlobalVars 从 engine.rb 中自己的文件中移出。
谁能告诉我我做错了什么?
【问题讨论】:
-
module configuration 的操作方法少了很多。如果您希望能够使用
MyEngine.foo而不是MyEngine.configuration.foo,那么只需使用委托。 -
您能说明
MyEngine::Option的定义方式和位置吗?我猜 rails 无法猜出自动加载它的正确路径? -
@nathanvda,在
app/models/my_engine/
标签: ruby-on-rails rails-engines