diff options
Diffstat (limited to 'activemodel/lib/active_model/callbacks.rb')
-rw-r--r-- | activemodel/lib/active_model/callbacks.rb | 79 |
1 files changed, 46 insertions, 33 deletions
diff --git a/activemodel/lib/active_model/callbacks.rb b/activemodel/lib/active_model/callbacks.rb index ebb4b51aa3..c52e4947ae 100644 --- a/activemodel/lib/active_model/callbacks.rb +++ b/activemodel/lib/active_model/callbacks.rb @@ -1,12 +1,10 @@ -require 'active_support/callbacks' - module ActiveModel - # == Active Model Callbacks + # == Active \Model \Callbacks # # Provides an interface for any class to have Active Record like callbacks. # # Like the Active Record methods, the callback chain is aborted as soon as - # one of the methods in the chain returns false. + # one of the methods in the chain returns +false+. # # First, extend ActiveModel::Callbacks from the class you are creating: # @@ -18,9 +16,10 @@ module ActiveModel # # define_model_callbacks :create, :update # - # This will provide all three standard callbacks (before, around and after) for - # both the :create and :update methods. To implement, you need to wrap the methods - # you want callbacks on in a block so that the callbacks get a chance to fire: + # This will provide all three standard callbacks (before, around and after) + # for both the <tt>:create</tt> and <tt>:update</tt> methods. To implement, + # you need to wrap the methods you want callbacks on in a block so that the + # callbacks get a chance to fire: # # def create # run_callbacks :create do @@ -28,8 +27,8 @@ module ActiveModel # end # end # - # Then in your class, you can use the +before_create+, +after_create+ and +around_create+ - # methods, just as you would in an Active Record module. + # Then in your class, you can use the +before_create+, +after_create+ and + # +around_create+ methods, just as you would in an Active Record module. # # before_create :action_before_create # @@ -37,39 +36,52 @@ module ActiveModel # # Your code here # end # + # When defining an around callback remember to yield to the block, otherwise + # it won't be executed: + # + # around_create :log_status + # + # def log_status + # puts 'going to call the block...' + # yield + # puts 'block successfully called.' + # end + # # You can choose not to have all three callbacks by passing a hash to the - # define_model_callbacks method. + # +define_model_callbacks+ method. # - # define_model_callbacks :create, :only => [:after, :before] + # define_model_callbacks :create, only: [:after, :before] # - # Would only create the after_create and before_create callback methods in your - # class. + # Would only create the +after_create+ and +before_create+ callback methods in + # your class. module Callbacks - def self.extended(base) + def self.extended(base) #:nodoc: base.class_eval do include ActiveSupport::Callbacks end end - # define_model_callbacks accepts the same options define_callbacks does, in case - # you want to overwrite a default. Besides that, it also accepts an :only option, - # where you can choose if you want all types (before, around or after) or just some. + # define_model_callbacks accepts the same options +define_callbacks+ does, + # in case you want to overwrite a default. Besides that, it also accepts an + # <tt>:only</tt> option, where you can choose if you want all types (before, + # around or after) or just some. # - # define_model_callbacks :initializer, :only => :after + # define_model_callbacks :initializer, only: :after # - # Note, the <tt>:only => <type></tt> hash will apply to all callbacks defined on - # that method call. To get around this you can call the define_model_callbacks + # Note, the <tt>only: <type></tt> hash will apply to all callbacks defined + # on that method call. To get around this you can call the define_model_callbacks # method as many times as you need. # - # define_model_callbacks :create, :only => :after - # define_model_callbacks :update, :only => :before - # define_model_callbacks :destroy, :only => :around + # define_model_callbacks :create, only: :after + # define_model_callbacks :update, only: :before + # define_model_callbacks :destroy, only: :around # - # Would create +after_create+, +before_update+ and +around_destroy+ methods only. + # Would create +after_create+, +before_update+ and +around_destroy+ methods + # only. # - # You can pass in a class to before_<type>, after_<type> and around_<type>, in which - # case the callback will call that class's <action>_<type> method passing the object - # that the callback is being called on. + # You can pass in a class to before_<type>, after_<type> and around_<type>, + # in which case the callback will call that class's <action>_<type> method + # passing the object that the callback is being called on. # # class MyModel # extend ActiveModel::Callbacks @@ -83,15 +95,14 @@ module ActiveModel # # obj is the MyModel instance that the callback is being called on # end # end - # def define_model_callbacks(*callbacks) options = callbacks.extract_options! options = { - :terminator => "result == false", - :skip_after_callbacks_if_terminated => true, - :scope => [:kind, :name], - :only => [:before, :around, :after] - }.merge(options) + :terminator => "result == false", + :skip_after_callbacks_if_terminated => true, + :scope => [:kind, :name], + :only => [:before, :around, :after] + }.merge!(options) types = Array(options.delete(:only)) @@ -104,6 +115,8 @@ module ActiveModel end end + private + def _define_before_model_callback(klass, callback) #:nodoc: klass.class_eval <<-CALLBACK, __FILE__, __LINE__ + 1 def self.before_#{callback}(*args, &block) |