0

既存の Rails アプリケーション用のプラグインを作成しています。コア アプリケーションに変更を加えることができないため、変更を外部に保持する必要があります。今のところ、私の最善の策は Observer のようです (これは Rails 4 以前のプロジェクトです)。基本的なエンジンとオブザーバーをセットアップしました。オブザーバーがコンソールで正しいクラスを監視していることを確認できますが、実際には他の Rails オブザーバーと共にロードされていません。

これが私のengine.rbです:

module Moodlesync
  class Engine < ::Rails::Engine
    initializer "moodlesync.canvas_plugin" do
      require_dependency 'moodlesync/observer'

      Canvas::Plugin.register :moodlesync_importer, :export_system, {
          :name => proc { I18n.t(:name, 'Moodle Sync') },
          :author => 'Beau Severson',
          :description => proc { t(:description, 'Sync course changes across Canvas and Moodle.') },
          :version => Moodlesync::VERSION,
          :settings_partial => 'moodlesync/plugin_settings',
          :hide_from_users => true,
          :settings => {
            :api_key => nil,
            :api_url => nil,
          }
      }

      config.active_record.observers ||= []
      config.active_record.observers << ':course_observer'
    end
  end
end

そのほとんどは、この Rails アプリ内で「プラグイン」をセットアップするためのものです。

これが私のobserver.rbです:

class CourseObserver < ActiveRecord::Observer
  observe :course

  def after_update(course)
    p "------------------------------------"
    p "-- A course has just been updated --"
    p "------------------------------------"
  end
end

ベースの Course オブジェクトにアクセスできるように、ここからネームスペースを削除しました。コンソールを起動すると、CourseObserver オブジェクトが Course クラスを正しく追跡していることを確認できます。

console > CourseObserver.observed_class
 => Course(id: integer, name: string, account_id: integer, ...

残念ながら、アクティブに実行されているオブザーバーを確認すると、CourseObserver が表示されません。

console > ActiveRecord::Base.observers
 => [:cacher, :stream_item_cache, :live_events_observer] 

コンソールで構成を確認すると、それが表示されます。

console > Rails.configuration.active_record.observers
 => [:cacher, :stream_item_cache, :live_events_observer, ":course_observer"] 

したがって、オブザーバーがロードされた後に私の設定がプッシュされているようです。既存のオブザーバーの前に注入する方法を知る必要があります。

4

1 に答える 1

0

後世のために:

私はあなたが欠けていると思います

config.before_initialize do
  config.active_record.observers << 'Moodlesync::CourseObserver'
end

エンジン内にオブザーバーがある場合は、名前空間を設定する必要があります。

私のエンジンの1つで同様のことを行う方法は次のとおりです。

# lib/tool/engine.rb
module Tool
  class Engine < ::Rails::Engine
    isolate_namespace Tool

    config.before_initialize do
      config.active_record.observers << 'Tool::UserObserver'
    end
  end
end

# app/observers/tool/user_observer.rb
module Tool
  class UserObserver < ActiveRecord::Observer
   observe Tool::User

   # ...     
  end
end   

そしてあなたのレールコンソールで:

console > ActiveRecord::Base.observers
=> [:some_observer, :another_observer, "Tool::UserObserver"]
于 2018-01-09T09:26:50.467 に答える