diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 74260d5029..ed8f37d3ab 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1416,7 +1416,7 @@ def unlink(path, opts = {}, &bk) route 'UNLINK', path, opts, &bk end # in `extensions` available to the handlers and templates def helpers(*extensions, &block) class_eval(&block) if block_given? - include(*extensions) if extensions.any? + prepend(*extensions) if extensions.any? end # Register an extension. Alternatively take a block from which an diff --git a/test/helpers_test.rb b/test/helpers_test.rb index 3575e945cd..71703d92e8 100644 --- a/test/helpers_test.rb +++ b/test/helpers_test.rb @@ -1941,5 +1941,27 @@ def foo assert ok? assert_equal '42 < 43', body end + + it 'prepends modules so previously-defined methods can be overridden consistently' do + mock_app do + helpers do + def one; nil; end + def two; nil; end + end + + helpers ::HelperOne do + def two; '2' end + end + + get('/one') { one } + get('/two') { two } + end + + get '/one' + assert_equal '1', body + + get '/two' + assert_equal '2', body + end end end