我尝试从模块类内部访问URL帮助程序。这是我的代码:
module Station
class Plugins
@@plugins = [] unless defined?(@@plugins) && @@plugins.class == Array
class << self
def all
return @@plugins.sort_by { |p| p[:weight] }
end
def register(plugin = {})
raise "plugin must be a Hash (ie.: `register(:foo => 'bar')`)" unless plugin.class == Hash
raise "plugin must contain :name (ie.: `register(:name => 'my_plugin')`)" unless plugin[:name].present?
plugin[:weight] = 1 unless plugin[:weight].present?
plugin[:href] = eval("#{plugin[:name].downcase.pluralize}_url") unless plugin[:href].present?
@@plugins.push(plugin) unless @@plugins.include?(plugin)
end
end
# include default plugins:
Station::Plugins.register(:name => "Pages", :weight => -1)
end
end
当我运行我的服务器时,我得到了这个错误:
undefined local variable or method `pages_url' for Station::Plugins:Class
我读了很多关于"如何从类调用 url 助手"的信息,但我找到的解决方案都不适合我。
首先,您不清楚的是,您尝试访问的 url 帮助程序是否来自引擎添加到的父应用程序,或者它是否来自此引擎包含的另一个引擎。
如果来自父应用程序,那么您所需要的只是:
main_app.pages_url
因此,您需要相应地编辑代码。请注意,"main_app"部分不是父应用程序的名称,而是字面意思是"main_app"。
如果您尝试访问此引擎中包含的引擎的 url 帮助程序,则需要像从父应用程序访问任何引擎一样访问它。 即:
您的宝石规格文件应包括:
s.add_dependency('my_engine', path: "~/path/to/my_engine")
routes.rb 应包括:
mount MyEngine::Engine => "/my_engine", as: "any_name_for_my_engine"
然后使用以下方法在代码中访问它:
any_name_for_my_engine.pages_url
希望这有帮助。
编辑:将引擎的 application.rb 文件更改为如下所示,以便您可以继承所有父应用程序的 ApplicationController 变量和路由:
class Station::ApplicationController < ApplicationController
end
您可能想阅读 Rails Guide on Engines,以获取有关如何使它们协同工作的更详细说明。如果您仍然遇到问题,请再问一次。
对我有用的是将帮助程序包含在特定的类中:
include ENGINE_NAME::Engine.routes.url_helpers
include Rails.application.routes.url_helpers
这对我有用,在阅读ActionPack的代码时找到了它。
包含跨不同引擎的所有挂载的帮助程序和应用程序的
main_app
帮助程序。如果要访问其他引擎的路由,则可以将其包含在类中。
include ActionDispatch::Routing::RouteSet::MountedHelpers