diff --git a/actionpack/lib/action_controller/middleware_stack.rb b/actionpack/lib/action_controller/middleware_stack.rb index ee0ae48ac03df38b352b49f444836f54d3b218dc..b739a6d72d6c3b55d3ea058cde303c6686ea32fa 100644 --- a/actionpack/lib/action_controller/middleware_stack.rb +++ b/actionpack/lib/action_controller/middleware_stack.rb @@ -67,11 +67,17 @@ def inspect def build(app) if block - klass.new(app, *args, &block) + klass.new(app, *build_args, &block) else - klass.new(app, *args) + klass.new(app, *build_args) end end + + private + + def build_args + Array(args).map { |arg| arg.respond_to?(:call) ? arg.call : arg } + end end def initialize(*args, &block) diff --git a/actionpack/lib/action_controller/middlewares.rb b/actionpack/lib/action_controller/middlewares.rb index fd70eca1b1ca7a4abe797508493b082d9289cbc2..371cf6d8f71c630232e3ef5ce6dd341fe9511188 100644 --- a/actionpack/lib/action_controller/middlewares.rb +++ b/actionpack/lib/action_controller/middlewares.rb @@ -5,7 +5,7 @@ use "ActionController::Failsafe" use lambda { ActionController::Base.session_store }, - ActionController::Base.session_options + lambda { ActionController::Base.session_options } use "ActionController::RewindableInput" use "ActionController::ParamsParser" diff --git a/actionpack/test/controller/middleware_stack_test.rb b/actionpack/test/controller/middleware_stack_test.rb index 612a710fa7967a01d2a4618264bd06be5f734dd1..918231013a8e08118b94a5731bdd49754637bc3c 100644 --- a/actionpack/test/controller/middleware_stack_test.rb +++ b/actionpack/test/controller/middleware_stack_test.rb @@ -80,4 +80,11 @@ def setup end assert_equal BazMiddleware, @stack.last.klass end + + test "lazy evaluates middleware arguments" do + assert_difference "@stack.size" do + @stack.use BazMiddleware, lambda { :foo } + end + assert_equal [:foo], @stack.last.send(:build_args) + end end