2

オブザーバーを正確に作成する方法の説明に従ったと思います、モデルページ:

class Page
  include Mongoid::Document
  field :title, type: String
  field :content, type: String
end

オブザーバーがあります (app/observers/page_observer.rb):

class PageObserver < Mongoid::Observer
  observe :page # just to be sure!

  def initialize
    puts "Page observer initialized"
  end
  def after_update page
    puts "After update page "+page
  end
end

config/application.rb に追加しました:

config.mongoid.observers = :page_observer

それから私がするときrails c、私は得る:

$ rails c
Page observer initialized
Loading development environment (Rails 3.2.13)
1.9.3p194 :005 > p = Page.first
 => #<Page _id: 5174ce01681167de23000001, title: "Hi", content: nil> 
1.9.3p194 :006 > p.title = "Hi1"
 => "Hi1" 
1.9.3p194 :007 > p.save
 => true 

「更新後のページ」が表示されたはずではありませんp.saveか?

この単純化された例の完全なコード: https://github.com/dts/mongoid_observer_test

4

1 に答える 1

0

Rails モデルは必要になるまでロードされませんが、まだロードされていないクラスにオブザーバーを登録することはできないため、最初に Page クラスを強制的にロードする必要があります。他のすべてのファイルがロードされた後、つまり後に追加require File.expand_path('../../app/models/article', __FILE__)して みてくださいapplication.rbif defined?(Bundler) ... end

于 2013-04-28T21:15:40.807 に答える