簡體   English   中英

在隔離的Rails引擎中從父應用程序訪問幫助程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM