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:
parent
b04473e51e
commit
558336ee2a
3 changed files with 58 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue