Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@whereisciao
Forked from outoftime/observing.rb
Created February 10, 2011 15:34
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save whereisciao/820720 to your computer and use it in GitHub Desktop.
Save whereisciao/820720 to your computer and use it in GitHub Desktop.
Mongoid Observer using ActiveModel.
require "#{RAILS_ROOT}/lib/mongoid/lib/observing.rb"
# Initializer for Observers
User.observers = :user_observer
User.instantiate_observers
# The preferred syntax, similar to AR's setup
# Mongoid.configure do |config|
# config.observers = :user_observer
# end
module Mongoid
module Observing
CALLBACKS = [
:before_create, :before_destroy, :before_save, :before_update,
:before_validation, :after_create, :after_destroy, :after_save,
:after_update, :after_validation
]
def self.included(base)
base.module_eval { include ActiveModel::Observing }
CALLBACKS.each do |callback|
callback_method = :"notify_observers_#{callback}"
base.module_eval <<-RUBY, __FILE__, __LINE__+1
#{callback}(#{callback_method.inspect})
def #{callback_method}(&block)
notify_observers(#{callback.inspect}, &block)
end
private #{callback_method.inspect}
RUBY
end
end
end
end
require 'carrierwave/orm/mongoid'
class User
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Observing
field :name
field :username
end
class UserObserver < ActiveModel::Observer
def after_validation(user)
puts "User Observer After Validation"
end
end
@gawin
Copy link

gawin commented May 24, 2011

My observer callbacks were called twice. Before and after the original model validation.

Fixed it by removing the explicit callback in the module eval, which causes the observer callback only to trigger after the orignal model callback.

https://gist.github.com/988791

@angelim
Copy link

angelim commented May 24, 2011

No luck using the core support for observers officially added in Mongoid by @cgriego?

@gawin
Copy link

gawin commented May 25, 2011

@angelim, works well with the Mongoid::Observer in master, however our production env isn't upgraded to Mongoid >= 2.0.0 yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment