Ruby on rails 覆盖Rails引擎视图/布局时访问主应用程序帮助程序
我创建了一个简单的Rails引擎,为应用程序提供一些通用功能(照片库)。我希望能够覆盖标准的_标题部分,以便库的菜单与我的主应用程序的菜单匹配。在我的头视图中,我调用了一个作为应用程序帮助程序(主应用程序)一部分的帮助程序,但我不断收到“undefined method”错误。从我可以告诉你的情况来看,当我覆盖引擎应用程序布局或其部分时,主应用程序应用程序的帮助程序(显然)没有被包括在内 所以我的问题是,如何在主应用程序中重写引擎视图,并访问主应用程序助手方法?我仍然需要访问引擎助手,并且不要破坏引擎功能 我也需要覆盖控制器吗?只是为了找些帮手似乎很难 谢谢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 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找到了一个好的解决方案!谢谢