【问题标题】:Inject engine observer into rails application将引擎观察器注入到 Rails 应用程序中
【发布时间】:2015-07-10 20:44:09
【问题描述】:

我正在为现有的 Rails 应用程序创建一个插件。我将无法对核心应用程序进行更改,因此我必须尝试将我的更改保留在外部。到目前为止,我最好的选择似乎是观察者(这是一个 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

其中大部分用于在此 Rails 应用程序中设置“插件”。

这是我的observer.rb:

class CourseObserver < ActiveRecord::Observer
  observe :course

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

我取消了此处的命名空间,以便可以访问基础课程对象。如果我启动控制台,我可以检查 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"] 

所以看起来我的配置是在加载观察者之后被推入的。我需要知道如何在预先存在的观察者之前让那些被注入。

【问题讨论】:

  • 我不一定有答案,但值得注意的是":course_observer":course_observer 是两个独立的东西,一个字符串和一个符号。您是否看到添加符号而不是字符串的行为发生了变化?
  • 此时我似乎并没有获得不同的功能。我之前在我的观察者属性中尝试使用命名空间时引入了引号。我找到了另一个答案here 来解决类似的问题,建议这样做。所以它曾经读过"Moodlesync::CourseObserver"。无论哪种方式,我当前的问题似乎是在 Rails 启动该数组中的观察者之前没有分配我的config.active_record.observers
  • 您找到解决问题的方法了吗?我有兴趣做与此非常相似的事情。

标签: ruby-on-rails ruby ruby-on-rails-3 canvas-lms


【解决方案1】:

为了子孙后代:

我觉得你不见了

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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多