Ruby on rails 覆盖Rails引擎视图/布局时访问主应用程序帮助程序

Ruby on rails 覆盖Rails引擎视图/布局时访问主应用程序帮助程序,ruby-on-rails,ruby-on-rails-3.1,rails-engines,rails-3.1,Ruby On Rails,Ruby On Rails 3.1,Rails Engines,Rails 3.1,我创建了一个简单的Rails引擎,为应用程序提供一些通用功能(照片库)。我希望能够覆盖标准的_标题部分,以便库的菜单与我的主应用程序的菜单匹配。在我的头视图中,我调用了一个作为应用程序帮助程序(主应用程序)一部分的帮助程序,但我不断收到“undefined method”错误。从我可以告诉你的情况来看,当我覆盖引擎应用程序布局或其部分时,主应用程序应用程序的帮助程序(显然)没有被包括在内 所以我的问题是,如何在主应用程序中重写引擎视图,并访问主应用程序助手方法?我仍然需要访问引擎助手,并且不要破

我创建了一个简单的Rails引擎,为应用程序提供一些通用功能(照片库)。我希望能够覆盖标准的_标题部分,以便库的菜单与我的主应用程序的菜单匹配。在我的头视图中,我调用了一个作为应用程序帮助程序(主应用程序)一部分的帮助程序,但我不断收到“undefined method”错误。从我可以告诉你的情况来看,当我覆盖引擎应用程序布局或其部分时,主应用程序应用程序的帮助程序(显然)没有被包括在内

所以我的问题是,如何在主应用程序中重写引擎视图,并访问主应用程序助手方法?我仍然需要访问引擎助手,并且不要破坏引擎功能

我也需要覆盖控制器吗?只是为了找些帮手似乎很难

谢谢


Rails 3.1.3

尝试在应用程序中创建与引擎中的帮助程序同名的帮助程序,以覆盖引擎帮助程序方法


我觉得特别有见地。在“独立引擎助手”下还有一些有趣的想法。

尝试包括主要的应用程序助手方法。例如:

class MyEngineClass
  include ApplicationHelper

  #...
end
您可能首先需要该文件,尽管我希望Rails在这种情况下能够正确地找到它

包含ApplicationHelper后,您应该能够直接在控制器中使用这些帮助程序


它看起来还可以为许多Rails类调用
ClassName.helper(“应用程序”)
,但不确定这在这里是否有效。

免责声明:我只在Rails 3.2引擎中使用过此解决方案

如果您的引擎中有标准标题部分供应商/gems/my_gallery\u引擎/app/views/application/\u header.html.erb

然后,在主应用程序中通过创建自定义的部分app/views/application/_header.html.erb来覆盖它

这种覆盖之所以有效,是因为Rails的视图模板搜索路径(默认情况下)从主应用程序“app/views目录开始,然后按加载顺序通过引擎”app/views进行搜索


所有主应用程序的帮助程序都将在部分应用程序中可用。

引擎应该独立于主应用程序,这就是您无法从引擎访问其帮助程序的原因

然而,有一些黑客的方法可以让你的引擎访问主应用程序的助手。我就是这样做的:

# In the main app
# initializers/share_helpers_path_with_engine.rb
PhotoGallery::Engine.class_eval do
  paths["app/helpers"] << File.join(File.dirname(__FILE__), '../..', 'app/helpers')
end
主应用程序中的
#
#初始化器/共享\u帮助器\u路径\u与\u engine.rb
照片库::Engine.class_eval do
路径[“应用程序/帮助程序”]查看此博客帖子:
作者向应用程序助手添加了一个缺少定义的方法,以便访问父应用程序的助手

/config/initializers/blogit.rb

module Blogit
    module ApplicationHelper
      def method_missing method, *args, &block
        puts "LOOKING FOR ROUTES #{method}"
        if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
          if main_app.respond_to?(method)
            main_app.send(method, *args)
          else
            super
          end
        else
          super
        end
      end

      def respond_to?(method)
        if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
          if main_app.respond_to?(method)
            true
          else
            super
          end
        else
          super
        end
      end
    end
  end

您是否尝试过
main\u应用程序。您的\u helper\u方法
?如果您不想覆盖控制器,请尝试本文中概述的方法。这只是添加了
\u路径
\u url
帮助程序,这是我所需要的。不过,有一个更好的解决方案。将
helper Rails.application.routes.url\u helpers添加到引擎的
ApplicationController
。请参阅我在链接博客上的评论。对于OP,您可能可以使用与
helper Rails.application.helpers
相同的技术。Rails引擎API文档帮助我为url\u helpers找到了一个好的解决方案!谢谢