module Her::Model::Hooks
Her
supports hooks/callbacks that are triggered whenever resources are created, updated or destroyed.
@example Defining a hook with a block
class User include Her::Model before_save { |resource| resource.internal_id = 42 } end
@example Defining a hook with a method name
class User include Her::Model before_save :set_internal_id private def set_internal_id self.internal_id = 42 end end
Public Instance Methods
Add a *after create* callback. Triggered after a resource is created. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 47 def after_create(method=nil, &block); set_hook(:after, :create, method || block); end
Add a *after destroy* callback. Triggered after a resource is destroyed. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 55 def after_destroy(method=nil, &block); set_hook(:after, :destroy, method || block); end
Add a *after find* callback. Triggered after a resource is found. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 59 def after_find(method=nil, &block); set_hook(:after, :find, method || block); end
Add a *after save* callback. Triggered after a resource is created or updated. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 43 def after_save(method=nil, &block); set_hook(:after, :save, method || block); end
Add a *after update* callback. Triggered after a resource is updated. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 51 def after_update(method=nil, &block); set_hook(:after, :update, method || block); end
Add a *before create* callback. Triggered before a resource is created. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 28 def before_create(method=nil, &block); set_hook(:before, :create, method || block); end
Add a *before destroy* callback. Triggered before a resource is destroyed. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 36 def before_destroy(method=nil, &block); set_hook(:before, :destroy, method || block); end
Do not add a *before find* callback. Only *after find* is supported.
# File lib/her/model/hooks.rb, line 39 def before_find(method=nil, &block); raise NoMethodError, "undefined method `before_find' for #{self}"; end
Add a *before save* callback. Triggered before a resource is created or updated. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 24 def before_save(method=nil, &block); set_hook(:before, :save, method || block); end
Add a *before update* callback. Triggered before a resource is updated. @param [Symbol, &block] method A method or a block to be called
# File lib/her/model/hooks.rb, line 32 def before_update(method=nil, &block); set_hook(:before, :update, method || block); end
@private
# File lib/her/model/hooks.rb, line 70 def hooks @her_hooks ||= begin if superclass.respond_to?(:hooks) superclass.hooks.dup else {} end end end
Wrap a block between “before” and “after” hooks @private
# File lib/her/model/hooks.rb, line 63 def wrap_in_hooks(resource, *hooks) perform_before_hooks(resource, *hooks) yield(resource, resource.class) if block_given? perform_after_hooks(resource, *hooks.reverse) end
Private Instance Methods
Perform “after” hooks on a resource @private
# File lib/her/model/hooks.rb, line 99 def perform_after_hooks(resource, *hooks) hooks.each do |hook| perform_hook(resource, :after, hook) end end
Perform “before” hooks on a resource @private
# File lib/her/model/hooks.rb, line 107 def perform_before_hooks(resource, *hooks) hooks.each do |hook| perform_hook(resource, :before, hook) end end
@private
# File lib/her/model/hooks.rb, line 87 def perform_hook(record, time, name) Array(self.hooks["#{time}_#{name}".to_sym]).each do |hook| if hook.is_a? Symbol record.send(hook) else hook.call(record) end end end
@private
# File lib/her/model/hooks.rb, line 82 def set_hook(time, name, action) (self.hooks["#{time}_#{name}".to_sym] ||= []) << action end