class RuboCop::Cop::Rails::AfterCommitOverride
after_update_commit :log_update_action
after_create_commit :log_create_action
# good
after_save_commit :log_action
# good
after_commit :log_action, on: :destroy
# This will override both previous callbacks.
after_update_commit :log_action
# This won’t be triggered.
after_commit :log_action, on: :create
# This won’t be triggered.
# bad
after_update_commit :log_action
# after_create_commit.
# This will override the callback added by
after_create_commit :log_action
# This won’t be triggered.
# bad
@example
and ‘after_destroy_commit`) with the same callback name per model.
(and its aliases - `after_create_commit`, `after_update_commit`,
Enforces that there is only one call to `after_commit`
def after_commit_callback?(node)
def after_commit_callback?(node) AFTER_COMMIT_CALLBACKS.include?(node.method_name) end
def each_after_commit_callback(class_node)
def each_after_commit_callback(class_node) class_send_nodes(class_node).each do |node| yield node if after_commit_callback?(node) && named_callback?(node) end end
def named_callback?(node)
def named_callback?(node) name = node.first_argument return false unless name name.sym_type? end
def on_class(class_node)
def on_class(class_node) seen_callback_names = {} each_after_commit_callback(class_node) do |node| callback_name = node.first_argument.value if seen_callback_names.key?(callback_name) add_offense(node, message: format(MSG, name: callback_name)) else seen_callback_names[callback_name] = true end end end