从Engine类访问url_helper

Aky*_*RhO 4 ruby-on-rails class urlhelper rails-engines

我尝试从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
Run Code Online (Sandbox Code Playgroud)

当我运行我的服务器时,我收到了这个错误:

undefined local variable or method `pages_url' for Station::Plugins:Class
Run Code Online (Sandbox Code Playgroud)

我读了很多关于"如何从类中调用url helper"的内容,但我找到的解决方案都没有为我工作.

The*_*dis 9

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

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

main_app.pages_url
Run Code Online (Sandbox Code Playgroud)

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

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

您的gemspec文件应包括:

s.add_dependency('my_engine', path: "~/path/to/my_engine")
Run Code Online (Sandbox Code Playgroud)

routes.rb应包括:

mount MyEngine::Engine => "/my_engine", as: "any_name_for_my_engine"
Run Code Online (Sandbox Code Playgroud)

然后使用以下代码访问代码:

any_name_for_my_engine.pages_url
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

编辑: 更改引擎的application.rb文件,如下所示,以便您可以继承所有父应用程序的ApplicationController变量和路由:

class Station::ApplicationController < ApplicationController
end
Run Code Online (Sandbox Code Playgroud)

您可能需要阅读"引擎上Rails指南",以获取有关如何使这些工作协同工作的更详细说明.如果你还有问题,请再问一次.