Не удается получить доступ к модели изнутри метода ActionController, добавленного движком Rails - PullRequest
0 голосов
/ 11 июля 2011

Я разрабатываю движок 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 становится недоступной. Похоже, Руби считает, что это должен быть класс в ActionController:

NameError (неинициализированная константа ActionController :: Аудиторская :: InstanceMethods :: AuditorLog)

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

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

1 Ответ

1 голос
/ 11 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...