5

Railsプラグインを最新の3.0RC1リリースで動作するエンジンにアップグレードしていますが、拡張するための最良の(そして最も正しい)方法を見つけるのに少し問題がありますActionController。DHHによるこの投稿と、SOに関するこの質問を見てきましたが、私の質問は、内のコードを適切に呼び出す方法に関するものActionControllerです。

たとえば、エンジンのコントローラー内で次のように呼び出す必要があります。

class ApplicationController < ActionController::Base
  helper :all

  before_filter :require_one_user
  after_filter :store_location

  private
    def require_one_user
      # Code goes here
    end

    def store_location
      # Code goes here
    end
end

2つのプライベート関数を適切に含める方法は知っていますが、、、およびを適切に呼び出す方法が見つかりhelperませbefore_filterafter_filter

いくつかのリンクまたはこれを機能させる方法をいただければ幸いです。コントローラーに別の名前を付けてApplicationController、実際ApplicationControllerに拡張してみましたが、それもうまくいかないようです。私は、エンジンユーザーの生活を可能な限り簡単にするソリューションを本当に望んでいます。理想的には、クラスを拡張する必要はありませんが、すべての機能が独自に組み込まれていApplicationControllerます。

4

2 に答える 2

10

また、エンジンサブクラス内の初期化子を調べて、コントローラークラス内にビューヘルパーを含める必要がないようにすることもできます。これにより、これらのモジュールのロード順序を制御できます。

これが私が使っているものです:


module MyEngine  
  class Engine < Rails::Engine  
    initializer 'my_engine.helper' do |app|  
      ActionView::Base.send :include, MyEngineHelper  
    end  

    initializer 'my_engine.controller' do |app|  
      ActiveSupport.on_load(:action_controller) do  
         include MyEngineActionControllerExtension  
      end
    end
  end
end

また、アクションコントローラー拡張機能のもう1つのオプションは、ミックスインモジュールを使用することです。これにより、before_filter、after_filterなどを使用できるようになります。


module MyEngineActionControllerExtension
  def self.included(base)
    base.send(:include, InstanceMethods) 
    base.before_filter :my_method_1
    base.after_filter :my_method_2
  end

  module InstanceMethods
   #...........
  end
end

もう1つ...gemのトップレベルにデフォルトのrailsディレクトリを作成する場合、ヘルパーやコントローラーが必要になることを心配する必要はありません。エンジンサブクラスはそれらにアクセスできます。そこで、ここにアプリケーションコントローラーとアプリケーションヘルパー拡張機能を追加します。

/myengine/app/helpers/myengine_application_helper_extension.rb
/myengine/app/controllers/my_engine_action_controller_extension.rb

Railsアプリのapplication_controllerとapplication_helperに似ているので、このセットアップが気に入っています。繰り返しになりますが、これは個人的な好みですが、コントローラー、ヘルパー、モデルなど、レールに直接関連するものはすべて/ my_engine / app内に、プラグインに関連するものはすべて/ my_engine/lib内に保持するようにしています。

初期化子の詳細については、Jose Valimによるこのチュートリアルを確認してください: https://gist.github.com/e139fa787aa882c0aa9c(engine_nameは現在非推奨ですが、このドキュメントのほとんどは最新のようです)

于 2010-08-16T02:25:23.967 に答える
3

それで、私はついに解決策を見つけました、そしてそれが他の誰かを助けることを願っています。

実際にクラスを拡張するため、libディレクトリにファイルを作成する必要があります。やったmyplugin/lib/extensions/action_controller_base.rb

次に、myplugin/lib/myplugin.rbファイル内で次の手順を実行します。

require 'extensions/action_controller_base.rb'

中にmyplugin/lib/extensions/action_controller_base.rbは以下を入れてください:

require 'action_controller'  # Make sure ActionController::Base is defined

ActionController::Base.class_eval {
  private
    def my_method_1
      # Code Goes Here
    end

    def my_method_2
      # Code Goes Here
    end
}

ActionController::Base.instance_eval {
  helper_method :my_method_1, :my_method_2

  before_filter :my_method_1
  after_filter :my_method_2
}

ビューヘルパーが必要な場合は、myplugin/lib/helpersディレクトリ(または、lib内の何か、「ヘルパー」という名前は関係ありません)にも作成し、以下を下部に追加しますmyplugin/lib/extensions/action_controller_base.rb

require 'helpers/helper_file_1'
require 'helpers/helper_file_2'

ActionView::Base.send :include, MyHelper1
ActionView::Base.send :include, MyHelper2
于 2010-08-14T16:16:49.143 に答える