Rails 6 adds ActionDispatch::Request::Session#dig

Amit Choudhary

Amit Choudhary

September 18, 2019

This blog is part of our  Rails 6 series.

Rails 6 added ActionDispatch::Request::Session#dig.

This works the same way as Hash#dig (Link is not available).

It extracts the nested value specified by the sequence of keys.

Hash#dig (Link is not available) was introduced in Ruby 2.3.

Before Rails 6, we can achieve the same thing by first converting session to a hash and then calling Hash#dig (Link is not available) on it.

Let's checkout how it works.

Rails 5.2

Let's add some user information in session and use dig after converting it to a hash.

1>> session[:user] = { email: '[email protected]', name: { first: 'Jon', last: 'Snow' }  }
2
3=> {:email=>"[email protected]", :name=>{:first=>"Jon", :last=>"Snow"}}
4
5>> session.to_hash
6
7=> {"session_id"=>"5fe8cc73c822361e53e2b161dcd20e47", "_csrf_token"=>"gyFd5nEEkFvWTnl6XeVbJ7qehgL923hJt8PyHVCH/DA=", "return_to"=>"http://localhost:3000", "user"=>{:email=>"[email protected]", :name=>{:first=>"Jon", :last=>"Snow"}}}
8
9
10>> session.to_hash.dig("user", :name, :first)
11
12=> "Jon"

Rails 6.0.0.rc1

Let's add the same information to session and now use dig on session object without converting it to a hash.

1>> session[:user] = { email: '[email protected]', name: { first: 'Jon', last: 'Snow' }  }
2
3=> {:email=>"[email protected]", :name=>{:first=>"Jon", :last=>"Snow"}}
4
5>> session.dig(:user, :name, :first)
6
7=> "Jon"

Here is the relevant pull request.

If this blog was helpful, check out our full blog archive.

Stay up to date with our blogs.

Subscribe to receive email notifications for new blog posts.