From d55f238e840f54dbb5ef79142b83faebe99d5995 Mon Sep 17 00:00:00 2001 From: Mike Pastore Date: Wed, 7 Dec 2016 14:51:00 -0600 Subject: [PATCH] Use prepend instead of include for helpers. Fixes #1213 --- lib/sinatra/base.rb | 2 +- test/helpers_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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..69c37fdcd2 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