簡體   English   中英

從 Rails 引擎初始化程序訪問幫助程序和模型

[英]Accessing helpers and models from rails engine initializer

我正在嘗試在 Rails 引擎上制作 Ruby,並且我希望初始化程序能夠訪問幫助程序和模型。
我將在下面寫一個示例、部分代碼以及我遇到的錯誤。 這可能不是推薦的方式,因為我可以看到在某些情況下我在重復自己,但這是我制作的第一個引擎。

文件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中還有一個名為OptionsControllerOptionsHelper ,在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)

如果我更改為僅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 class。 即使將它們放在同一目錄中,我也必須添加 require 和 include 才能使其工作。 此外,為了工作,我必須將GlobalVars從 engine.rb 中自己的文件中移出。

有人可以告訴我我做錯了什么嗎?

在我為每個 class 使用 required 之后,我以ActiveRecord::ConnectionNotEstablished結束,似乎在創建GLOBAL ZA8CFDE6331BD59EB2AC96F8911C4B66 時,並非所有內容都已加載並可用。

因此,我將使用模型的代碼移到了單獨的init方法中。 然后,我添加了一個 after initialize 事件:

  config.after_initialize do
    MyEngine.GLOBAL.init
  end

我看到了一個可能的問題:因為您在模塊MyEngine內部,所以實際上 rails 可能正在尋找MyEngine::MyEngine::Option ,所以我看到了兩種方法:

  • 只需寫Option :這將尋找MyEngine::Option
  • 編寫::MyEngine::Option這將在全局命名空間中查找並找到MyEngine::Option

其次,如果這沒有幫助,即使您的路徑看起來正確,但您始終可以在文件頂部明確require "my_engine/option" 我不完全確定引擎中的自動加載以完全相同的方式工作,而且我傾向於在我的engine文件中需要幾乎所有東西(以確保它工作)。

在我的engine.rb我做

require_relative '../../app/models/my_engine/option'

也許這會有所幫助,但這不是一個好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM