Method: ActiveSupport::Callbacks::ClassMethods#skip_callback
- Defined in:
- activesupport/lib/active_support/callbacks.rb
#skip_callback(name, *filter_list, &block) ⇒ Object
Skip a previously set callback. Like #set_callback, :if or :unless options may be passed in order to control when the callback is skipped.
Note: this example uses PersonRecord and #saving_message, which you can see defined here
class Writer < PersonRecord
attr_accessor :age
skip_callback :save, :before, :saving_message, if: -> { age > 18 }
end
When if option returns true, callback is skipped.
writer = Writer.new
writer.age = 20
writer.save
Output:
- save
saved
When if option returns false, callback is NOT skipped.
young_writer = Writer.new
young_writer.age = 17
young_writer.save
Output:
saving...
- save
saved
An ArgumentError will be raised if the callback has not already been set (unless the :raise option is set to false).
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 |
# File 'activesupport/lib/active_support/callbacks.rb', line 786 def skip_callback(name, *filter_list, &block) type, filters, = normalize_callback_params(filter_list, block) [:raise] = true unless .key?(:raise) __update_callbacks(name) do |target, chain| filters.each do |filter| callback = chain.find { |c| c.matches?(type, filter) } if !callback && [:raise] raise ArgumentError, "#{type.to_s.capitalize} #{name} callback #{filter.inspect} has not been defined" end if callback && (.key?(:if) || .key?(:unless)) new_callback = callback.(chain, if_option: [:if], unless_option: [:unless]) chain.insert(chain.index(callback), new_callback) end chain.delete(callback) end target.set_callbacks name, chain end end |