Module: Observational

Defined in:
lib/observational.rb,
lib/observational/observer.rb,
lib/observational/observable.rb,
lib/observational/active_record_observers.rb

Defined Under Namespace

Modules: ActiveRecordObservers, Observable Classes: Observer

Instance Method Summary collapse

Instance Method Details

#observes(model_name, opts = {}) ⇒ Object

Declares an observer

Parameters:

  • the (Symbol)

    name of the model to observe

  • opts (Hash) (defaults to: {})

    observer options

Options Hash (opts):

  • :invokes (Symbol)

    The method to invoke on the subscriber.

  • :with (Symbol)

    The parameters to pass to the method that gets invoked.

  • :on (Symbol)

    The action to observe. e.g. :after_create for an active_record object

  • :after (Symbol)

    A shortcut for AR objects. :after => :create is the equivalent of :on => :after_create

  • :before (Symbol)

    Same as :after



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/observational.rb', line 16

def observes(model_name, opts = {})
  opts.assert_valid_keys :with, :invokes, :on, :before, :after

  opts[:on]   = :"before_#{opts[:before]}" unless opts[:before].nil?
  opts[:on]   = :"after_#{opts[:after]}" unless opts[:after].nil?

  opts[:observed_attrs] = (self.column_names - (opts[:except] || []))
  opts[:observed_attrs] = opts[:only] if opts[:only]

  model_klass = model_name.to_s.classify.constantize
  model_klass.send(:include, Observable) unless model_klass.include?(Observable)
  observer    = Observational::Observer.new :method     => opts[:invokes],
                                            :parameters => opts[:with].nil? ? nil : [*opts[:with]],
                                            :subscriber => self,
                                            :actions    => opts[:on],
                                            :observed_attrs => opts[:observed_attrs]
  model_klass.add_observer(observer)
end