从Rails引擎初始化程序访问帮助程序和模型

问题描述 投票:0回答:1

我正在尝试制作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的控制器:

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)

虚拟应用程序中没有任何内容。上面定义的所有帮助程序和模型都在引擎中。

[在此之前,我还有其他错误,因为它无法访问帮助程序或Functions类。我必须添加require和include使其工作,即使它们位于同一目录中也是如此。另外,要工作,我必须将GlobalVars从engine.rb中自己的文件中移动。

有人可以告诉我我在做什么错吗?

ruby-on-rails rails-engines
1个回答
0
投票

只写Option:它将寻找MyEngine::Option

    写入::MyEngine::Option,它将在全局名称空间中查找并找到MyEngine::Option
  • [其次,即使您的路径看起来正确,如果这样做没有帮助,但是您始终可以在文件顶部显式require "my_engine/option"。我并不完全确定引擎中的自动加载是否可以以完全相同的方式工作,并且我倾向于在我的engine文件中要求几乎所有内容(以确保工作正常)。
  • © www.soinside.com 2019 - 2024. All rights reserved.