从Engine类访问url_helper

时间:2012-06-10 10:57:48

标签: ruby-on-rails class rails-engines urlhelper

我尝试从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 helper”,但我发现的解决方案都没有为我工作。

3 个答案:

答案 0 :(得分:8)

首先,您要弄清楚的是,您尝试访问的url帮助程序是否来自添加引擎的父应用程序,或者是否来自此引擎已包含的其他引擎。

如果来自父申请,那么您只需要:

main_app.pages_url

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

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

您的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以获取有关如何协同工作的更详细说明。再问一下你是否还有问题。

答案 1 :(得分:0)

对我有用的是将帮助者包括在特定的类中:

3008    Gebo Armaturen GmbH 110563  2M  AM  2   KOPP.BINDR.X FLEX 2 X 63,5 MM   -1141.70000000000000000000
3008    Gebo Armaturen GmbH 110565  2M  AM  2   KOPP.BINDR.X FLEX 5/4 X 44 MM   -1141.70000000000000000000
3008    Gebo Armaturen GmbH 110567  2M  AM  2   KOPP.BINDR.X FLEX 6/4 X 51 MM   -1141.70000000000000000000
3008    Gebo Armaturen GmbH 110569  2M  AM  2   KOPP.BINDR.X FLEX 2 X 57 MM -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75432   2M  AM  2   gebo 046206015 rep.kopp. 15 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75433   2M  AM  2   gebo 046206022 rep.kopp. 22 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75434   2M  AM  2   gebo 046206028 rep.kopp. 28 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75435   2M  AM  2   gebo 046206035 rep.kopp. 35 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75442   2M  AM  2   gebo 012522801 rep.kopp 1/2 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75443   2M  AM  2   gebo 012522802 rep.kopp 3/4 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75445   2M  AM  2   gebo 012522803 rep.kopp 1"  -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75449   2M  AM  2   gebo 012522804 rep.kopp 5/4 -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75450   2M  AM  2   gebo 012522805 rep.kopp 1 1/2   -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75451   2M  AM  2   gebo 012522806 rep.kopp 2"  -1141.70000000000000000000
3008    Gebo Armaturen GmbH 75452   2M  AM  2   gebo 012522807 rep.kopp 2 1/2   -1141.70000000000000000000
3047    Tasseron Sensors bv 906701  2M  AM  2   vaillant 287606 ntc voeler pl   -881.00000000000000000000
3047    Tasseron Sensors bv 906703  2M  AM  2   vaillant 287607 ntc voeler aa   -881.00000000000000000000
3047    Tasseron Sensors bv 913194  2M  AM  2   bosch 87229333160 ntc m6 r  -881.00000000000000000000

答案 2 :(得分:0)

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

<块引用>

包含跨不同引擎的所有挂载帮助程序和应用程序的 main_app 帮助程序。如果您想访问其他引擎的路由,您可以将其包含在您的类中。

include ActionDispatch::Routing::RouteSet::MountedHelpers