1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add wrap_with_notifications helper to AMo observing

This commit is contained in:
Joshua Peek 2009-07-20 23:57:01 -05:00
parent 2685d93b07
commit 7c84bbf160
5 changed files with 35 additions and 13 deletions

View file

@ -1,7 +1,8 @@
require 'observer' require 'observer'
require 'singleton' require 'singleton'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/array/wrap' require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/module/aliasing'
require 'active_support/core_ext/string/inflections'
module ActiveModel module ActiveModel
module Observing module Observing
@ -39,6 +40,23 @@ module ActiveModel
observers.each { |o| instantiate_observer(o) } observers.each { |o| instantiate_observer(o) }
end end
# Wraps methods with before and after notifications.
#
# wrap_with_notifications :create, :save, :update, :destroy
def wrap_with_notifications(*methods)
methods.each do |method|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
def #{method}_with_notifications(*args, &block)
notify_observers(:before_#{method})
result = #{method}_without_notifications(*args, &block)
notify_observers(:after_#{method})
result
end
EOS
alias_method_chain(method, :notifications)
end
end
protected protected
def instantiate_observer(observer) def instantiate_observer(observer)
# string/symbol # string/symbol
@ -60,7 +78,7 @@ module ActiveModel
end end
private private
def notify(method) #:nodoc: def notify_observers(method)
self.class.changed self.class.changed
self.class.notify_observers(method, self) self.class.notify_observers(method, self)
end end

View file

@ -349,7 +349,7 @@ module ActiveRecord
result = send(method) result = send(method)
end end
notify(method) notify_observers(method)
return result return result
end end

View file

@ -34,6 +34,7 @@ module ActiveResource
autoload :Connection, 'active_resource/connection' autoload :Connection, 'active_resource/connection'
autoload :CustomMethods, 'active_resource/custom_methods' autoload :CustomMethods, 'active_resource/custom_methods'
autoload :Formats, 'active_resource/formats' autoload :Formats, 'active_resource/formats'
autoload :Observing, 'active_resource/observing'
autoload :Validations, 'active_resource/validations' autoload :Validations, 'active_resource/validations'
autoload :HttpMock, 'active_resource/http_mock' autoload :HttpMock, 'active_resource/http_mock'
end end

View file

@ -804,8 +804,7 @@ module ActiveResource
# my_company.size = 10 # my_company.size = 10
# my_company.save # sends PUT /companies/1 (update) # my_company.save # sends PUT /companies/1 (update)
def save def save
notify(:before_save) new? ? create : update
(new? ? create : update).tap { notify(:after_save) }
end end
# Deletes the resource from the remote service. # Deletes the resource from the remote service.
@ -821,8 +820,7 @@ module ActiveResource
# new_person.destroy # new_person.destroy
# Person.find(new_id) # 404 (Resource Not Found) # Person.find(new_id) # 404 (Resource Not Found)
def destroy def destroy
notify(:before_destroy) connection.delete(element_path, self.class.headers)
connection.delete(element_path, self.class.headers).tap { notify(:after_destroy) }
end end
# Evaluates to <tt>true</tt> if this resource is not <tt>new?</tt> and is # Evaluates to <tt>true</tt> if this resource is not <tt>new?</tt> and is
@ -997,20 +995,16 @@ module ActiveResource
# Update the resource on the remote service. # Update the resource on the remote service.
def update def update
notify(:before_update)
connection.put(element_path(prefix_options), encode, self.class.headers).tap do |response| connection.put(element_path(prefix_options), encode, self.class.headers).tap do |response|
load_attributes_from_response(response) load_attributes_from_response(response)
notify(:after_update)
end end
end end
# Create (i.e., \save to the remote service) the \new resource. # Create (i.e., \save to the remote service) the \new resource.
def create def create
notify(:before_create)
connection.post(collection_path, encode, self.class.headers).tap do |response| connection.post(collection_path, encode, self.class.headers).tap do |response|
self.id = id_from_response(response) self.id = id_from_response(response)
load_attributes_from_response(response) load_attributes_from_response(response)
notify(:after_create)
end end
end end
@ -1093,7 +1087,6 @@ module ActiveResource
class Base class Base
extend ActiveModel::Naming extend ActiveModel::Naming
include CustomMethods, Validations include CustomMethods, Observing, Validations
include ActiveModel::Observing
end end
end end

View file

@ -0,0 +1,10 @@
module ActiveResource
module Observing
extend ActiveSupport::Concern
include ActiveModel::Observing
included do
wrap_with_notifications :create, :save, :update, :destroy
end
end
end