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