From b9eb68e2bb0f95dd786b213a821865bb7ae368f8 Mon Sep 17 00:00:00 2001 From: Jim Benton Date: Wed, 9 May 2012 10:34:03 -0500 Subject: [PATCH] Ensure ActionView::Base.field_error_proc is preserved when exceptions occur within with_simple_form_field_error_proc. --- .../action_view_extensions/form_helper.rb | 10 ++++--- .../form_helper_test.rb | 28 ++++++++++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/simple_form/action_view_extensions/form_helper.rb b/lib/simple_form/action_view_extensions/form_helper.rb index 136af662..5fd7c65a 100644 --- a/lib/simple_form/action_view_extensions/form_helper.rb +++ b/lib/simple_form/action_view_extensions/form_helper.rb @@ -43,10 +43,12 @@ module SimpleForm def with_simple_form_field_error_proc default_field_error_proc = ::ActionView::Base.field_error_proc - ::ActionView::Base.field_error_proc = FIELD_ERROR_PROC - result = yield - ::ActionView::Base.field_error_proc = default_field_error_proc - result + begin + ::ActionView::Base.field_error_proc = FIELD_ERROR_PROC + yield + ensure + ::ActionView::Base.field_error_proc = default_field_error_proc + end end def simple_form_css_class(record, options) diff --git a/test/action_view_extensions/form_helper_test.rb b/test/action_view_extensions/form_helper_test.rb index 6913ebdd..3948d6a6 100644 --- a/test/action_view_extensions/form_helper_test.rb +++ b/test/action_view_extensions/form_helper_test.rb @@ -109,11 +109,37 @@ class FormHelperTest < ActionView::TestCase expected_error_proc = lambda {} ActionView::Base.field_error_proc = expected_error_proc + result = nil simple_form_for :user do |f| - simple_fields_for 'address' do + result = simple_fields_for 'address' do + 'hello' end end + assert_equal 'hello', result + assert_equal expected_error_proc, ActionView::Base.field_error_proc + + ensure + ActionView::Base.field_error_proc = previous_error_proc + end + end + + test 'custom error proc survives an exception' do + previous_error_proc = ActionView::Base.field_error_proc + + begin + expected_error_proc = lambda {} + ActionView::Base.field_error_proc = expected_error_proc + + begin + simple_form_for :user do |f| + simple_fields_for 'address' do + raise 'an exception' + end + end + rescue StandardError => e + end + assert_equal expected_error_proc, ActionView::Base.field_error_proc ensure