Permalink
Browse files

Merge pull request #4596 from kennyj/fix_4344

Fix GH #4344. Callback defined in a module is not triggered when the module extends an object under Rails 3.2rc2
  • Loading branch information...
2 parents dea2523 + 5e59d75 commit e23dbec33094bfb38f97b7f300fdc70299521f56 @josevalim josevalim committed Jan 24, 2012
Showing with 57 additions and 1 deletion.
  1. +1 −1 activesupport/lib/active_support/callbacks.rb
  2. +56 −0 activesupport/test/callbacks_test.rb
@@ -359,7 +359,7 @@ module ClassMethods
def __run_callbacks(key, kind, object, &blk) #:nodoc:
name = __callback_runner_name(kind)
unless object.respond_to?(name)
- str = send("_#{kind}_callbacks").compile(key, object)
+ str = object.send("_#{kind}_callbacks").compile(key, object)
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
def #{name}() #{str} end
protected :#{name}
@@ -344,6 +344,54 @@ def save
end
end
+ module ExtendModule
+ def self.extended(base)
+ base.class_eval do
+ set_callback :save, :before, :record3
+ end
+ end
+ def record3
+ @recorder << 3
+ end
+ end
+
+ module IncludeModule
+ def self.included(base)
+ base.class_eval do
+ set_callback :save, :before, :record2
+ end
+ end
+ def record2
+ @recorder << 2
+ end
+ end
+
+ class ExtendCallbacks
+
+ include ActiveSupport::Callbacks
+
+ define_callbacks :save
+ set_callback :save, :before, :record1
+
+ include IncludeModule
+
+ def save
+ run_callbacks :save
+ end
+
+ attr_reader :recorder
+
+ def initialize
+ @recorder = []
+ end
+
+ private
+
+ def record1
+ @recorder << 1
+ end
+ end
+
class AroundCallbacksTest < ActiveSupport::TestCase
def test_save_around
around = AroundPerson.new
@@ -645,4 +693,12 @@ def test_skip_writer
end
end
+ class ExtendCallbacksTest < ActiveSupport::TestCase
+ def test_save
+ model = ExtendCallbacks.new.extend ExtendModule
+ model.save
+ assert_equal [1, 2, 3], model.recorder
+ end
+ end
+
end

0 comments on commit e23dbec

Please sign in to comment.