提交 558336ee 编写于 作者: A Andrew White

Commit flash changes when using a redirect route.

In ca324a0d 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.
上级 b04473e5
* 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 @@ def serve(req)
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 @@ def test_paths_with_partial_dynamic_segments_are_recognised
)
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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册