24

我创建了一个简单的 Rails 引擎来为应用程序提供一些通用功能(照片库)。我希望能够覆盖标准的 _header 部分,以便画廊的菜单与我的主应用程序的菜单相匹配。在我的标题视图中,我调用了一个属于 application_helpers (主应用程序)的助手,但我不断收到“未定义的方法”错误。据我所知,当我覆盖引擎应用程序布局或其部分时,主应用程序 application_helpers 没有被包含(显然)。

所以我的问题是,我如何覆盖主应用程序中的引擎视图,并访问主应用程序帮助方法?我仍然需要访问引擎助手,并且不要搞砸引擎功能。

我是否也需要覆盖控制器?似乎很多只是为了得到一些帮助。

谢谢

导轨 3.1.3

4

5 回答 5

3

查看这篇博文:http: //www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/ 作者在应用程序助手中添加了一个method_missing定义以便访问父应用程序的助手。

/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
于 2013-10-18T15:16:29.333 回答
2

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

class MyEngineClass
  include ApplicationHelper

  #...
end

您可能首先需要该文件,但我希望 Rails 在这种情况下能够正确找到它。

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

看起来你也可以调用ClassName.helper("application")很多 Rails 类——不确定这是否可以在这里工作。

于 2012-09-12T04:27:34.807 回答
1

尝试在您的应用程序中创建一个与引擎中的助手名称相同的助手,以覆盖引擎助手方法。

我发现这个讨论特别有见地。在隔离引擎助手下的Rails 引擎 API 文档中也有一些有趣的想法。

于 2012-03-13T20:33:45.283 回答
1

引擎应该独立于主应用程序,这就是为什么你不能从引擎访问它的助手。

但是,有一些 hack-ish 方法可以让您的引擎访问主应用程序的助手。我是这样做的:

# 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

您当然需要更改PhotoGallery为引擎类的实际名称。

随意查看引擎文档(关于路径的部分):http ://edgeapi.rubyonrails.org/classes/Rails/Engine.html

于 2012-10-03T03:18:59.853 回答
0

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

如果,在您的引擎中,您有一个标准头部分vendor/gems/my_gallery_engine/app/views/application/_header.html.erb

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

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

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

于 2012-10-01T03:56:22.540 回答