Accept cookies consent banner in Rails
According to GDPR regulations you might need to add a banner on your site where a website visitor can accept/reject cookies.
A basic cookies modal can look like this:

We can store this decision in session[:cookies_accepted].
If a user accepts - expect normal website behavior.
If a user rejects - you might want to disable some tracking services:
<%= render "shared/google_analytics" if (session[:cookies_accepted] == true) %>
HOWTO #
Generate views, controllers, routes for our cookies:
# Terminal
rails g controller cookies index
- Render the cookies view inside a
turbo_frame_tag; - Display links to
accept/rejectmodals:
# app/views/shared/cookies_banner.html.erb
<%= turbo_frame_tag :cookies_modal do %>
<% if session[:cookies_accepted].nil? # don't re-render if a true/false selected %>
<section class="cookies-modal">
<h3>We process cookies.</h3>
<%= link_to "Accept cookies", cookies_path(cookies: true), method: :post %>
<%= link_to "Reject cookies", cookies_path(cookies: false), method: :post %>
</section>
<% end %>
<% end %>
Positioning the modal with css:
/* app/assets/stylesheets/application.css */
.cookies-modal {
position: absolute;
padding: 0.5rem;
z-index: 2;
left: 0.5rem;
bottom: 0.5rem;
min-width: 50%;
max-width: 24rem;
word-break: break-word;
border-radius: 6px;
background: #bad5ff;
}
A simplistic route:
# config/routes.rb
get 'cookies', to: 'cookies#index'
Display cookies template, update preferences based on selected accept/reject params:
# app/controllers/cookies_controller.rb
def index
session[:cookies_accepted] = params[:cookies] if params[:cookies]
end
Finally, to make the cookies modal visible in the app, conditionally display a turbo_frame pointing to the cookies_banner in the layout, if the cookies true/false has not yet been selected:
# app/views/application.html.erb
<%= session[:cookies_accepted] # display selected value for testing purposes %>
<%= turbo_frame_tag :cookies_modal, src: cookies_path if session[:cookies_accepted].nil? %>
P.S. for setting session[:cookies_accepted] to nil and re-testing the above, you can simply add the below line to any #GET controller action in your app and visit the page:
# app/controllers/home_controller.rb
class HomeController < ApplicationController
def index
+ session[:cookies_accepted] = nil
end
end
That’s it!
Alternatively, there are some cookies/GDPR gems:
-
infinum/cookies_eu- Gem to add cookie consent to Rails application -
prey/gdpr_rails- Rails Engine for the GDPR compliance -
osano/cookieconsent- A free solution to the EU, GDPR, and California Cookie Laws
Did you like this article? Did it save you some time?