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