aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/lib/active_support/callbacks.rb10
-rw-r--r--activesupport/test/callbacks_test.rb24
2 files changed, 32 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/callbacks.rb b/activesupport/lib/active_support/callbacks.rb
index 96ce79e896..b531a094cf 100644
--- a/activesupport/lib/active_support/callbacks.rb
+++ b/activesupport/lib/active_support/callbacks.rb
@@ -225,7 +225,10 @@ module ActiveSupport
# end
[@compiled_options[0], @filter, @compiled_options[1]].compact.join("\n")
when :around
- "end"
+ <<-RUBY_EVAL
+ value
+ end
+ RUBY_EVAL
end
end
@@ -423,7 +426,7 @@ module ActiveSupport
#
# set_callback :save, :before, :before_meth
# set_callback :save, :after, :after_meth, :if => :condition
- # set_callback :save, :around, lambda { |r| stuff; yield; stuff }
+ # set_callback :save, :around, lambda { |r| stuff; result = yield; stuff }
#
# The second arguments indicates whether the callback is to be run +:before+,
# +:after+, or +:around+ the event. If omitted, +:before+ is assumed. This
@@ -442,6 +445,9 @@ module ActiveSupport
#
# 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
#
diff --git a/activesupport/test/callbacks_test.rb b/activesupport/test/callbacks_test.rb
index cff914f4ae..0b4cc4ac69 100644
--- a/activesupport/test/callbacks_test.rb
+++ b/activesupport/test/callbacks_test.rb
@@ -299,6 +299,22 @@ module CallbacksTest
end
end
end
+
+ class AroundPersonResult < MySuper
+ attr_reader :result
+
+ set_callback :save, :around, :tweedle_dum
+
+ def tweedle_dum
+ @result = yield
+ end
+
+ def save
+ run_callbacks :save do
+ :running
+ end
+ end
+ end
class HyphenatedCallbacks
include ActiveSupport::Callbacks
@@ -338,6 +354,14 @@ module CallbacksTest
], around.history
end
end
+
+ class AroundCallbackResultTest < Test::Unit::TestCase
+ def test_save_around
+ around = AroundPersonResult.new
+ around.save
+ assert_equal :running, around.result
+ end
+ end
class SkipCallbacksTest < Test::Unit::TestCase
def test_skip_person