[英]Access Main App Helpers when overridings a Rails Engine View/Layout
我創建了一個簡單的Rails引擎,為應用程序提供一些通用功能(照片庫)。 我希望能夠覆蓋標准_header部分,以便庫的菜單與我的主應用程序的菜單匹配。 在我的標題視圖中,我調用了一個幫助程序,它是application_helpers(主應用程序)的一部分,但我不斷收到“未定義的方法”錯誤。 據我所知,當我覆蓋引擎應用程序布局或其部分時,主應用程序application_helpers沒有被包括(顯然)。
所以我的問題是,如何覆蓋主應用程序中的引擎視圖,並獲得對主應用程序幫助程序方法的訪問權限? 我仍然需要訪問引擎助手,而不是搞砸引擎功能。
我是否還需要覆蓋控制器? 得到一些幫助似乎很多。
謝謝
Rails 3.1.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
嘗試包含主要的app幫助方法。 例如:
class MyEngineClass
include ApplicationHelper
#...
end
您可能需要先請求該文件,但我希望Rails能夠在這種情況下正確找到它。
一旦包含ApplicationHelper,您應該能夠直接在控制器中使用這些幫助程序。
看起來你可以為許多Rails類調用ClassName.helper("application")
- 不確定它是否可以在這里工作。
引擎應該獨立於主應用程序,這就是您無法從引擎訪問其助手的原因。
但是,有一些黑客方法可以讓您的引擎訪問主應用程序的幫助程序。 我就是這樣做的:
# 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
更改為引擎類的實際名稱。
請隨意查看Engines文檔(有關路徑的部分): http : //edgeapi.rubyonrails.org/classes/Rails/Engine.html
嘗試在您的應用程序中創建一個幫助程序,並在引擎中使用相同的幫助程序名稱來覆蓋引擎幫助程序方法。
我發現這個討論特別有見地。 在隔離引擎幫助程序下的Rails Engine API文檔中也有一些有趣的想法。
免責聲明:我在Rails 3.2引擎中只使用過這個解決方案。
如果您的引擎中有標准標題部分供應商/ gems / my_gallery_engine / app / views / application / _header.html.erb 。
然后,通過創建自定義的部分app / views / application / _header.html.erb ,在主應用中覆蓋它。
覆蓋是有效的,因為Rails的視圖模板搜索路徑(默認情況下)從主應用程序的app / views目錄開始,然后按加載順序搜索引擎的app / views 。
所有主要應用程序的助手都將部分提供。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.