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

Ensure compatibility between ActionDispatch::Request::Session and Rack

Adding the `each` method is required for ensuring compatibility between
Rails, and other Rack frameworks (like Sinatra, etc.), that are mounted
within Rails, and wish to use its session tooling. Prior to this, there
was an inconsistency between ActionDispatch::Request::Session and
Rack::Session::Cookie, due to the absence of the `each` method. This
should hopefully fix that error. :)

For a full integration test with Sinatra and a standalone Rack
application, you can check out the gist for that here: https://gist.github.com/maclover7/08cd95b0bfe259465314311941326470.

Solves #15843.
This commit is contained in:
Jon Moss 2016-05-02 17:56:57 -04:00
parent 08e86b4b05
commit 09159d8530
2 changed files with 31 additions and 1 deletions

View file

@ -9,7 +9,7 @@ module ActionDispatch
# Singleton object used to determine if an optional param wasn't specified
Unspecified = Object.new
# Creates a session hash, merging the properties of the previous session if any
def self.create(store, req, default_options)
session_was = find req
@ -198,6 +198,10 @@ module ActionDispatch
@delegate.merge!(other)
end
def each(&block)
to_hash.each(&block)
end
private
def load_for_read!

View file

@ -114,5 +114,31 @@ module ActionDispatch
}.new
end
end
class SessionIntegrationTest < ActionDispatch::IntegrationTest
class MySessionApp
def call(env)
request = Rack::Request.new(env)
request.session['hello'] = 'Hello from MySessionApp!'
[ 200, {}, ['Hello from MySessionApp!'] ]
end
end
Router = ActionDispatch::Routing::RouteSet.new
Router.draw do
get '/mysessionapp' => MySessionApp.new
end
def app
@app ||= RoutedRackApp.new(Router)
end
def test_session_follows_rack_api_contract_1
get '/mysessionapp'
assert_response :ok
assert_equal 'Hello from MySessionApp!', @response.body
assert_equal 'Hello from MySessionApp!', session['hello']
end
end
end
end