Невозможно получить доступ к модели изнутри метода ActionController, добавленного движком Rails

Я разрабатываю движок 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)

а не модель с моего двигателя.

Может кто-то указать мне верное направление? Я впервые создаю движок и пытаюсь упаковать его как драгоценный камень; Я искал примеры этого, и мне не очень повезло. Мой подход к добавлению этой возможности в класс ActionController был основан на том, что делает mobile_fu, поэтому, пожалуйста, дайте мне знать, если я ошибаюсь.


person Chris Hart    schedule 10.07.2011    source источник
comment
где определяется AuditorLog? Работает ли при ::AuditorLog?   -  person apneadiving    schedule 11.07.2011


Ответы (1)


Используйте :: AuditorLog для доступа к классу ActiveRecord (если он у вас нет в модуле или пространстве имен, и в этом случае вам нужно будет включить имя модуля).

person Jeremy Weathers    schedule 10.07.2011
comment
Отлично, это было легко. Спасибо, Джереми! - person Chris Hart; 11.07.2011