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:
parent
2685d93b07
commit
7c84bbf160
5 changed files with 35 additions and 13 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
10
activeresource/lib/active_resource/observing.rb
Normal file
10
activeresource/lib/active_resource/observing.rb
Normal 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
|
Loading…
Reference in a new issue