[英]Accessing helpers from the parent app in an isolated Rails engine
我正在編寫一個可配置的Rails引擎。 我有一個authentication_helper
配置選項來定義在需要身份驗證的所有控制器中的before_action
中應該調用哪個幫助器。
問題是我無法從引擎的控制器訪問父應用程序的幫助程序。 我的理解是,這是因為發動機是孤立的。
我考慮使用塊而不是方法名稱,但我不確定這是否可行,或者我是否能夠從控制器外部干凈地訪問授權邏輯。
我過去使用過的Active Admin有一個類似的配置選項。 我注意到他們的發動機沒有隔離,所以也許我高估了發動機隔離的重要性?
是否有一種優雅的方式來獲得引擎隔離的好處,同時還允許這種定制? 或者我應該完全放棄隔離?
編輯#1
Brad Werth指出了我正確的方向,因為這適用於繼承自ApplicationController::Base
的常規控制器:
module MyBigFancyEngine
class Engine < Rails::Engine
isolate_namespace MyBigFancyEngine
config.to_prepare do
# Make the implementing application's helpers available to the engine.
# This is required for the overriding of engine views and helpers to work correctly.
MyBigFancyEngine::ApplicationController.helper Rails.application.helpers
end
end
end
但是,我的引擎的ApplicationController
繼承自RocketPant::Base
,它不提供helper
方法。 我試過使用一個簡單的include
(對常規控制器工作正常),但這也不起作用(控制器找不到幫助器)。
有任何想法嗎?
您可以通過在engine.rb文件中包含以下代碼來公開引擎可用的實現應用程序幫助程序:
engine.rb
module MyBigFancyEngine
class Engine < Rails::Engine
isolate_namespace MyBigFancyEngine
config.to_prepare do
# Make the implementing application's helpers available to the engine.
# This is required for the overriding of engine views and helpers to work correctly.
MyBigFancyEngine::ApplicationController.helper Rails.application.helpers
end
end
end
RailsAdmin引擎也是獨立的,但它們具有您想要實現的相同配置選項。 它們具有可配置的before_filters,用於身份驗證和授權。 看看這個 。
據我所知,他們只是將父控制器子類化為這個::ApplicationController
或者你可以配置一個( ref )。
對於您的控制器,您可以創建自己的EngineController
,它繼承自RocketPant::Base
並且可能只是創建一個方法,通過父控制器上的send
直接調用配置的身份驗證方法。
由於RocketPant::Base
類不從ApplicationController::Base
繼承,我猜你必須找到一些自定義的方法,並且不能采用Rails引擎的常規方法。 也許您也可以嘗試向rocket_pant repo提交一個問題,以添加helper
方法。 據我所知,他們很快就想在2.0( ref )中繼承ApplicationController::Base
。
我認為你保持隔離是好的沖動 - 因為依賴於“只是在那里”的方法的解決方案是一個痛苦的調試,如果s.th. 使用您的寶石在應用程序中出錯(即方法名稱中的拼寫錯誤)。
此外,如果你的寶石進化,有一天它不需要這個方法,以一種明確的方式,它非常方便給出一個可怕的錯誤:
您可以提供在初始化程序中調用的配置方法:
YourGem.configure do |config|
config.add_callback { MyApp.doIt() }
end
我發現這個討論特別有見地 。 在隔離引擎幫助程序下的Rails引擎API中也有一些有趣的想法。
Rails Engine API文檔幫助我找到了url_helpers的一個很好的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.