5

我尝试从 Module 类内部访问 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 助手”的内容,但我找到的解决方案都没有为我工作。

4

3 回答 3

9

首先,您不清楚的是,您尝试访问的 url 助手是来自添加引擎的父应用程序,还是来自该引擎包含的另一个引擎。

如果来自父应用程序,那么您只需要:

main_app.pages_url

因此,您需要相应地编辑您的代码。请注意,“main_app”部分不是父应用程序的名称,而是字面意思的“main_app”。

如果您尝试访问包含在此引擎中的引擎的 url 帮助程序,则需要像访问父应用程序中的任何引擎一样访问它。IE:

您的 gemspec 文件应包括:

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以获得有关如何使这些协同工作的更详细说明。再次询问您是否仍有问题。

于 2012-06-10T11:13:52.200 回答
2

对我有用的是将助手包含在特定的类中:

include ENGINE_NAME::Engine.routes.url_helpers
include Rails.application.routes.url_helpers
于 2016-08-10T15:17:16.367 回答
0

这对我有用,是在阅读 ActionPack 的代码时发现的。

包含跨不同引擎的所有已安装助手和main_app应用程序的助手。如果您想访问其他引擎的路线,您可以将其包含在您的课程中。

include ActionDispatch::Routing::RouteSet::MountedHelpers
于 2021-07-30T12:24:06.147 回答