我正在编写一个可配置的Rails引擎.我有一个authentication_helper配置选项来定义在需要身份验证的所有控制器中的before_action中应该调用哪个帮助器.
问题是我无法从引擎的控制器访问父应用程序的帮助程序. My understanding是因为引擎被隔离而发生这种情况.
我考虑使用块而不是方法名称,但我不确定这是否可行,或者我是否能够从控制器外部干净地访问授权逻辑.
我过去使用的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,它不提供辅助方法.我试过使用一个简单的include(对常规控制器工作正常),但这也不起作用(控制器找不到帮助器).
有任何想法吗?
解决方法
RailsAdmin引擎也是独立的,但它们具有您想要实现的相同配置选项.它们具有可配置的before_filters,用于身份验证和授权.看看
this.
据我所知,他们只是将父控制器子类化为这个:: ApplicationController,或者你可以配置一个(ref).
对于您的控制器,您可以创建自己的EngineController,它继承自RocketPant :: Base,并且可能只是创建一个方法,通过父控制器上的send直接调用配置的身份验证方法.
由于RocketPant :: Base类不从ApplicationController :: Base继承,我猜你必须找到一些自定义的方法,并且不能采用Rails引擎的常规方法.也许您也可以尝试向rocket_pant repo提交一个问题,以添加帮助方法.据我所知,他们很快就想在2.0(ref)中继承ApplicationController :: Base.