module ActiveModel::Observing::ClassMethods

Public Instance Methods

add_observer(observer) click to toggle source

Add a new observer to the pool. The new observer needs to respond to update, otherwise it raises an ArgumentError exception.

class Foo
  include ActiveModel::Observing
end

class FooObserver < ActiveModel::Observer
end

Foo.add_observer(FooObserver.instance)

Foo.observers_instance
# => [#<FooObserver:0x007fccf55d9390>]
# File lib/rails/observers/active_model/observing.rb, line 125
def add_observer(observer)
  unless observer.respond_to? :update
    raise ArgumentError, "observer needs to respond to 'update'"
  end
  observer_instances << observer
end
count_observers() click to toggle source

count_observers is deprecated. Use observers_count.

# File lib/rails/observers/active_model/observing.rb, line 173
def count_observers
  msg = "count_observers is deprecated in favor of observers_count"
  ActiveSupport::Deprecation.warn(msg)
  observers_count
end
instantiate_observers() click to toggle source

Instantiate the global observers.

class Foo
  include ActiveModel::Observing

  attr_accessor :status
end

class FooObserver < ActiveModel::Observer
  def on_spec(record, *args)
    record.status = true
  end
end

Foo.observers = FooObserver

foo = Foo.new
foo.status = false
foo.notify_observers(:on_spec)
foo.status # => false

Foo.instantiate_observers # => [FooObserver]

foo = Foo.new
foo.status = false
foo.notify_observers(:on_spec)
foo.status # => true
# File lib/rails/observers/active_model/observing.rb, line 107
def instantiate_observers
  observers.each { |o| instantiate_observer(o) }
end
notify_observers(*args) click to toggle source

Fires notifications to model's observers.

def save
  notify_observers(:before_save)
  ...
  notify_observers(:after_save)
end

Custom notifications can be sent in a similar fashion:

notify_observers(:custom_notification, :foo)

This will call custom_notification, passing as arguments the current object and :foo.

# File lib/rails/observers/active_model/observing.rb, line 146
def notify_observers(*args)
  observer_instances.each { |observer| observer.update(*args) }
end
observer_instances() click to toggle source

Returns the current observer instances.

class Foo
  include ActiveModel::Observing

  attr_accessor :status
end

class FooObserver < ActiveModel::Observer
  def on_spec(record, *args)
    record.status = true
  end
end

Foo.observers = FooObserver
Foo.instantiate_observers

Foo.observer_instances # => [#<FooObserver:0x007fc212c40820>]
# File lib/rails/observers/active_model/observing.rb, line 76
def observer_instances
  @observer_instances ||= []
end
observers() click to toggle source

Gets an array of observers observing this model. The array also provides enable and disable methods that allow you to selectively enable and disable observers (see ActiveModel::ObserverArray#enable and ActiveModel::ObserverArray#disable for more on this).

class ORM
  include ActiveModel::Observing
end

ORM.observers = :cacher, :garbage_collector
ORM.observers       # => [:cacher, :garbage_collector]
ORM.observers.class # => ActiveModel::ObserverArray
# File lib/rails/observers/active_model/observing.rb, line 54
def observers
  @observers ||= ObserverArray.new(self)
end
observers=(*values) click to toggle source

Activates the observers assigned.

class ORM
  include ActiveModel::Observing
end

# Calls PersonObserver.instance
ORM.observers = :person_observer

# Calls Cacher.instance and GarbageCollector.instance
ORM.observers = :cacher, :garbage_collector

# Same as above, just using explicit class references
ORM.observers = Cacher, GarbageCollector

Note: Setting this does not instantiate the observers yet. instantiate_observers is called during startup, and before each development request.

# File lib/rails/observers/active_model/observing.rb, line 38
def observers=(*values)
  observers.replace(values.flatten)
end
observers_count() click to toggle source

Returns the total number of instantiated observers.

class Foo
  include ActiveModel::Observing

  attr_accessor :status
end

class FooObserver < ActiveModel::Observer
  def on_spec(record, *args)
    record.status = true
  end
end

Foo.observers = FooObserver
Foo.observers_count # => 0
Foo.instantiate_observers
Foo.observers_count # => 1
# File lib/rails/observers/active_model/observing.rb, line 168
def observers_count
  observer_instances.size
end