diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index ea1d090bc2..3105dbcc42 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,3 +1,10 @@ +* Fix an issue where rails raise exception about missing helper where it + should throw `LoadError`. When helper file exists and only loaded file from + this helper does not exist rails should throw LoadError instead of + `MissingHelperError`. + + *Piotr Niełacny* + * Fix `ActionDispatch::ParamsParser#parse_formatted_parameters` to rewind body input stream on parsing json params. diff --git a/actionpack/lib/abstract_controller/helpers.rb b/actionpack/lib/abstract_controller/helpers.rb index 5ae8c6c3b0..a928205963 100644 --- a/actionpack/lib/abstract_controller/helpers.rb +++ b/actionpack/lib/abstract_controller/helpers.rb @@ -150,7 +150,12 @@ module AbstractController @error = error @path = "helpers/#{path}.rb" set_backtrace error.backtrace - super("Missing helper file helpers/%s.rb" % path) + + if error.path =~ /^#{path}(\.rb)?$/ + super("Missing helper file helpers/%s.rb" % path) + else + raise error + end end end diff --git a/actionpack/test/abstract/.helper_test.rb.swp b/actionpack/test/abstract/.helper_test.rb.swp new file mode 100644 index 0000000000..d029f89288 Binary files /dev/null and b/actionpack/test/abstract/.helper_test.rb.swp differ diff --git a/actionpack/test/abstract/helper_test.rb b/actionpack/test/abstract/helper_test.rb index 7960e5b55b..2cc27fbecd 100644 --- a/actionpack/test/abstract/helper_test.rb +++ b/actionpack/test/abstract/helper_test.rb @@ -48,6 +48,14 @@ module AbstractController end end + class AbstractInvalidHelpers < AbstractHelpers + include ActionController::Helpers + + path = File.join(File.expand_path('../../fixtures', __FILE__), "helpers_missing") + $:.unshift(path) + self.helpers_path = path + end + class TestHelpers < ActiveSupport::TestCase def setup @controller = AbstractHelpers.new @@ -97,5 +105,17 @@ module AbstractController assert_equal "Hello Default", @controller.response_body end end + + class InvalidHelpersTest < ActiveSupport::TestCase + def test_controller_raise_error_about_real_require_problem + e = assert_raise(LoadError) { AbstractInvalidHelpers.helper(:invalid_require) } + assert_equal "No such file to load -- very_invalid_file_name", e.message + end + + def test_controller_raise_error_about_missing_helper + e = assert_raise(Helpers::ClassMethods::MissingHelperError) { AbstractInvalidHelpers.helper(:missing) } + assert_equal "Missing helper file helpers/missing_helper.rb", e.message + end + end end end diff --git a/actionpack/test/fixtures/helpers_missing/invalid_require_helper.rb b/actionpack/test/fixtures/helpers_missing/invalid_require_helper.rb new file mode 100644 index 0000000000..d8801e54d5 --- /dev/null +++ b/actionpack/test/fixtures/helpers_missing/invalid_require_helper.rb @@ -0,0 +1,5 @@ +require 'very_invalid_file_name' + +module InvalidRequireHelper +end +