diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index c01033026e..1e2cee63da 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1439,7 +1439,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/sinatra-contrib/lib/sinatra/namespace.rb b/sinatra-contrib/lib/sinatra/namespace.rb index 2998651966..c61b3327b5 100644 --- a/sinatra-contrib/lib/sinatra/namespace.rb +++ b/sinatra-contrib/lib/sinatra/namespace.rb @@ -232,7 +232,7 @@ def self.prefixed(*names) def helpers(*extensions, &block) class_eval(&block) if block_given? - include(*extensions) if extensions.any? + prepend(*extensions) if extensions.any? end def register(*extensions, &block) diff --git a/test/helpers_test.rb b/test/helpers_test.rb index 60489624a6..9b56ad3cd7 100644 --- a/test/helpers_test.rb +++ b/test/helpers_test.rb @@ -1947,5 +1947,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