2011-07-10 7 views
0

Railsエンジンを開発して、宝石としてパッケージ化します。私のエンジンのメインモジュールファイルでは、私は持っています:Railsエンジンによって追加されたActionControllerメソッドの中からモデルにアクセスできない

module Auditor 
    require 'engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3 
    require 'application_controller' 
end 

module ActionController 
    module Auditor 
    def self.included(base) 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 
     def is_audited 
     include ActionController::Auditor::InstanceMethods 
     before_filter :audit_request 
     end 
    end 

    module InstanceMethods 
     def audit_request 
     a = AuditorLog.new 
     a.save! 
     end 
    end 
    end 
end 

ActionController::Base.send(:include, ActionController::Auditor) 

ここで、AuditorLogはエンジンによっても提供されるモデルです。 (私の意図は、このエンジンを使用するアプリケーションのコントローラにis_auditedを追加して、要求の詳細を監査ログに記録することです)。

このコードがアプリケーションから呼び出されると、エンジンが使用されている場合、AuditorLogモデルにはアクセスできません。

NameError(初期化されていない一定の ActionController ::役:: InstanceMethods :: AuditorLog)

ではなく、私のエンジンからモデル:RubyがそれはActionController内のクラスでなければなりません思うように見えます。

誰でも正しい方向に向けることができますか?これは、エンジンを作り、それを宝石としてパッケージ化しようとした私の初めてのことです。私はこれの例を探し、多くの運がなかった。 ActionControllerクラスにこの機能を追加する私のアプローチは、mobile_fuの機能に基づいていました。

+0

「AuditorLog」はどこに定義されていますか? ':: AuditorLog'を実行すると動作しますか? – apneadiving

答えて

1

:: AuditorLogを使用してActiveRecordクラスにアクセスします(モジュールまたは名前空間で使用していない場合は、モジュール名を含める必要があります)。

+0

パーフェクト、簡単でした。ありがとう、ジェレミー! –

+0

私は少し台無しに感じる:) – apneadiving

関連する問題