我正在为现有的rails应用程序创建一个插件。我无法对核心应用程序进行更改,因此我必须尝试将更改保留在外部。截至目前,似乎我最好的选择是Observer(这是一个pre-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
其中很大一部分用于设置&#34;插件&#34;在这个Rails应用程序中。
这是我的观察者.rb:
class CourseObserver < ActiveRecord::Observer
observe :course
def after_update(course)
p "------------------------------------"
p "-- A course has just been updated --"
p "------------------------------------"
end
end
我从这里取出了命名空间,因此我可以访问基础课程对象。如果我启动我的控制台,我可以检查并看到CourseObserver对象正确跟踪课程类。
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"]
所以看起来我的配置在加载观察者之后被推入。我需要知道如何在预先存在的观察者之前注入那些注射器。
答案 0 :(得分:0)
为了子孙后代:
我认为你错过了
config.before_initialize do
config.active_record.observers << 'Moodlesync::CourseObserver'
end
如果你的引擎中有观察者,你需要命名它。
以下是我在我的某个引擎中设法做类似事情的方法:
# 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
在你的rails控制台中:
console > ActiveRecord::Base.observers
=> [:some_observer, :another_observer, "Tool::UserObserver"]