1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Commit flash changes when using a redirect route.

In ca324a0 the flash middleware was effectively removed by its
constructor returning the app it was passed and the `commit_flash`
call was moved to the `ActionController::Metal#dispatch` method.
This broke any redirect routes that modified the flash because the
redirect happens before `dispatch` gets called.

To fix it, this commit adds a `commit_flash` call in the `serve`
method of `ActionDispatch::Routing::Redirect`.

Fixes #27992.
This commit is contained in:
Andrew White 2017-02-25 16:55:07 +00:00
parent b04473e51e
commit 558336ee2a
3 changed files with 58 additions and 0 deletions

View file

@ -1,3 +1,10 @@
* Commit flash changes when using a redirect route.
Fixes #27992.
*Andrew White*
## Rails 5.1.0.beta1 (February 23, 2017) ##
* Prefer `remove_method` over `undef_method` when reloading routes

View file

@ -36,6 +36,8 @@ module ActionDispatch
uri.host ||= req.host
uri.port ||= req.port unless req.standard_port?
req.commit_flash
body = %(<html><body>You are being <a href="#{ERB::Util.unwrapped_html_escape(uri.to_s)}">redirected</a>.</body></html>)
headers = {

View file

@ -4913,3 +4913,52 @@ class TestInternalRoutingParams < ActionDispatch::IntegrationTest
)
end
end
class FlashRedirectTest < ActionDispatch::IntegrationTest
SessionKey = "_myapp_session"
Generator = ActiveSupport::LegacyKeyGenerator.new("b3c631c314c0bbca50c1b2843150fe33")
class KeyGeneratorMiddleware
def initialize(app)
@app = app
end
def call(env)
env["action_dispatch.key_generator"] ||= Generator
@app.call(env)
end
end
class FooController < ActionController::Base
def bar
render plain: (flash[:foo] || "foo")
end
end
Routes = ActionDispatch::Routing::RouteSet.new
Routes.draw do
get "/foo", to: redirect { |params, req| req.flash[:foo] = "bar"; "/bar" }
get "/bar", to: "flash_redirect_test/foo#bar"
end
APP = build_app Routes do |middleware|
middleware.use KeyGeneratorMiddleware
middleware.use ActionDispatch::Session::CookieStore, key: SessionKey
middleware.use ActionDispatch::Flash
middleware.delete ActionDispatch::ShowExceptions
end
def app
APP
end
include Routes.url_helpers
def test_block_redirect_commits_flash
get "/foo", env: { "action_dispatch.key_generator" => Generator }
assert_response :redirect
follow_redirect!
assert_equal "bar", response.body
end
end