instance method set_callback

Ruby on Rails 5.1.7

Since v3.0.20

Available in: v3.0.20 v3.1.12 v3.2.22.5 v4.0.13 v4.1.16 v4.2.11.3 v5.0.7.2 v5.1.7 v5.2.8.1 v6.0.6.1 v6.1.7.10 v7.0.10 v7.1.6 v7.2.3.2 v8.0.5.1 v8.1.3.1 edge

Signature

set_callback(name, *filter_list, &block)

Install a callback for the given event.

set_callback :save, :before, :before_method
set_callback :save, :after,  :after_method, if: :condition
set_callback :save, :around, ->(r, block) { stuff; result = block.call; stuff }

The second argument indicates whether the callback is to be run :before, :after, or :around the event. If omitted, :before is assumed. This means the first example above can also be written as:

set_callback :save, :before_method

The callback can be specified as a symbol naming an instance method; as a proc, lambda, or block; or as an object that responds to a certain method determined by the :scope argument to define_callbacks.

If a proc, lambda, or block is given, its body is evaluated in the context of the current object. It can also optionally accept the current object as an argument.

Before and around callbacks are called in the order that they are set; after callbacks are called in the reverse order.

Around callbacks can access the return value from the event, if it wasn’t halted, from the yield call.

Options
  • :if - A symbol, a string (deprecated) or an array of symbols, each naming an instance method or a proc; the callback will be called only when they all return a true value.

  • :unless - A symbol, a string (deprecated) or an array of symbols, each naming an instance method or a proc; the callback will be called only when they all return a false value.

  • :prepend - If true, the callback will be prepended to the existing chain rather than appended.

Parameters

name req
filter_list rest
block block
Source
# File activesupport/lib/active_support/callbacks.rb, line 662
        def set_callback(name, *filter_list, &block)
          type, filters, options = normalize_callback_params(filter_list, block)

          if options[:if].is_a?(String) || options[:unless].is_a?(String)
            ActiveSupport::Deprecation.warn(<<-MSG.squish)
              Passing string to be evaluated in :if and :unless conditional
              options is deprecated and will be removed in Rails 5.2 without
              replacement. Pass a symbol for an instance method, or a lambda,
              proc or block, instead.
            MSG
          end

          self_chain = get_callbacks name
          mapped = filters.map do |filter|
            Callback.build(self_chain, filter, type, options)
          end

          __update_callbacks(name) do |target, chain|
            options[:prepend] ? chain.prepend(*mapped) : chain.append(*mapped)
            target.set_callbacks name, chain
          end
        end

Defined in activesupport/lib/active_support/callbacks.rb line 662 · View on GitHub · Improve this page · Find usages on GitHub

Defined in ActiveSupport::Callbacks::ClassMethods

Type at least 2 characters to search.

Use the arrow keys to navigate results, Enter to open one, Escape to close.

Keyboard shortcuts

/
Focus search
⌘K / Ctrl-K
Command palette
?
This help
Esc
Close