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

Amit Choudhary

By Amit Choudhary

on 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: 'jon@bigbinary.com', name: { first: 'Jon', last: 'Snow' }  }
2
3=> {:email=>"jon@bigbinary.com", :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=>"jon@bigbinary.com", :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: 'jon@bigbinary.com', name: { first: 'Jon', last: 'Snow' }  }
2
3=> {:email=>"jon@bigbinary.com", :name=>{:first=>"Jon", :last=>"Snow"}}
4
5>> session.dig(:user, :name, :first)
6
7=> "Jon"

Here is the relevant pull request.

Stay up to date with our blogs. Sign up for our newsletter.

We write about Ruby on Rails, ReactJS, React Native, remote work,open source, engineering & design.