ruby-on-rails – 在隔离的Rails引擎中从父应用程序访问帮助程序

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在隔离的Rails引擎中从父应用程序访问帮助程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个可配置的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.

原文链接:https://www.f2er.com/ruby/265229.html

猜你在找的Ruby相关文章