26

エンジン内のヘルパーが消費側(親)アプリケーションにアクセスできないという問題に対処する記事をいくつか見つけました。私たち全員が同じページにいることを確認するために、これがあるとしましょう:

module MyEngine
  module ImportantHelper
    def some_important_helper
      ...do something important...
    end
  end
end

「Isolatedengine'shelpers」(L293)のレールエンジンのドキュメントを見ると、次のようになっています。

  # Sometimes you may want to isolate engine, but use helpers that are defined for it.
  # If you want to share just a few specific helpers you can add them to application's
  # helpers in ApplicationController:
  #
  # class ApplicationController < ActionController::Base
  #   helper MyEngine::SharedEngineHelper
  # end
  #
  # If you want to include all of the engine's helpers, you can use #helpers method on an engine's
  # instance:
  #
  # class ApplicationController < ActionController::Base
  #   helper MyEngine::Engine.helpers
  # end

したがって、私のエンジンを消費している人に、これをapplication_controller.rbに追加するように依頼すると、その人は私の重要なヘルパーメソッドすべてにアクセスできるようになります。

class ApplicationController < ActionController::Base
  helper MyEngine::ImportantHelper
end

これは私が望んでいることであり、機能しますが、特に私のユースケースのように、エンジンが公開するすべてのものを消費アプリのどこでも使用できる/使用する必要がある場合は、それは一種の苦痛です。そこで、もう少し掘り下げて、次のことを提案する解決策を見つけました。

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine

    config.to_prepare do
      ApplicationController.helper(ImportantHelper)
    end
  end
end

これがまさに私が望んでいることです。すべてのImportantHelperメソッドを親アプリのアプリケーションヘルパーに追加します。ただし、機能しません。誰かが私がこのより良い解決策が機能しない理由を理解するのを手伝ってもらえますか?

私はレール3.1.3でruby1.8.7を実行しています。この問題に密接に関係する重要な情報を見逃した場合はお知らせください。事前に感謝します。

4

5 に答える 5

44

次のように、これを実現するための初期化子を作成できます。

module MyEngine
  class Engine < Rails::Engine
    initializer 'my_engine.action_controller' do |app|
      ActiveSupport.on_load :action_controller do
        helper MyEngine::ImportantHelper
      end
    end
  end
end
于 2012-03-09T21:18:35.833 に答える
6

エンジンを最初から作成することについて2つのブログ投稿を書きました。それらに従うと、すべてが期待どおりに機能するはずです(追加の構成は必要ありません)。多分あなたはまだ興味があります:

更新:それまでの間に3つの記事がありますが、まだいくつかの情報があります。フィードバックをお願いします。

于 2012-10-01T08:41:49.123 に答える
6

すべての実装アプリケーションではなく、エンジンにコードを保持する場合は、次を使用します。

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine

    config.to_prepare do
      MyEngine::ApplicationController.helper Rails.application.helpers
    end

  end
end
于 2013-07-31T16:23:15.253 に答える
1
module YourEngine
  module Helpers
    def a_helper
    end

    ...
  end
end

ActionController::Base.send(:helper, YourEngine::Helpers)
于 2012-02-23T02:57:38.447 に答える
1

このコードをengine.rbに含めることも非常に役立ちます

config.before_initialize do
  ActiveSupport.on_load :action_controller do
    helper MyEngine::Engine.helpers
  end
end

基本的にあなたのエンジンは次のようになります

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine

    # Here comes the code quoted above 

  end
end
于 2014-10-21T21:08:39.457 に答える