[英]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中還有一個名為OptionsController
的OptionsHelper
,在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.