0

宝石としてパッケージ化するRailsエンジンを開発しています。私のエンジンのメインモジュールファイルには、次のものがあります。

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モデルにアクセスできないことです。RubyはそれがActionControllerのクラスであるべきだと考えているようです。

NameError(初期化されていない定数ActionController :: Auditor :: InstanceMethods :: AuditorLog)

私のエンジンのモデルではなく。

誰かが私を正しい方向に向けることができますか?エンジンを作成し、それをgemとしてパッケージ化するのはこれが初めてです。私はこの例を探しましたが、あまり運がありませんでした。この機能をActionControllerクラスに追加するための私のアプローチは、mobile_fuの機能に基づいていたので、これがすべて間違っている場合はお知らせください。

4

1 に答える 1

1

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

于 2011-07-10T20:55:52.927 に答える