give a better error message for misspelled helpers

See comment in this patch for the rationale.

References #16468
This commit is contained in:
Xavier Noria 2014-10-25 13:58:38 +02:00
parent ae07806858
commit 8d7cf75684
3 changed files with 38 additions and 1 deletions

@ -150,7 +150,17 @@ def modules_for_helpers(args)
rescue LoadError => e
raise AbstractController::Helpers::MissingHelperError.new(e, file_name)
end
file_name.camelize.constantize
mod_name = file_name.camelize
begin
mod_name.constantize
rescue LoadError
# dependencies.rb gives a similar error message but its wording is
# not as clear because it mentions autoloading. To the user all it
# matters is that a helper module couldn't be loaded, autoloading
# is an internal mechanism that should not leak.
raise NameError, "Couldn't find #{mod_name}, expected it to be defined in helpers/#{file_name}.rb"
end
when Module
arg
else

@ -60,6 +60,12 @@ def index
end
end
class HelpersTypoController < ActionController::Base
path = File.expand_path('../../fixtures/helpers_typo', __FILE__)
$:.unshift(path)
self.helpers_path = path
end
module LocalAbcHelper
def a() end
def b() end
@ -82,6 +88,22 @@ def test_helpers_paths_priority
end
end
class HelpersTypoControllerTest < ActiveSupport::TestCase
def setup
@autoload_paths = ActiveSupport::Dependencies.autoload_paths
ActiveSupport::Dependencies.autoload_paths = Array(HelpersTypoController.helpers_path)
end
def test_helper_typo_error_message
e = assert_raise(NameError) { HelpersTypoController.helper 'admin/users' }
assert_equal "Couldn't find Admin::UsersHelper, expected it to be defined in helpers/admin/users_helper.rb", e.message
end
def teardown
ActiveSupport::Dependencies.autoload_paths = @autoload_paths
end
end
class HelperTest < ActiveSupport::TestCase
class TestController < ActionController::Base
attr_accessor :delegate_attr

@ -0,0 +1,5 @@
module Admin
module UsersHelpeR
end
end