DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

Cover image for How to Add ToS Agreement Checkbox to Your Rails App using Devise?
Zil Norvilis
Zil Norvilis

Posted on • Updated on

How to Add ToS Agreement Checkbox to Your Rails App using Devise?

In this article, I will show you how to add functionality to your new registration view, which will force the user to agree to your app's Terms of Service (ToS) when creating new account.

I am using these gems:

  • Rails 6.1.4.1
  • Devise 4.8
  • Simple Form 5.1
  • Haml 5.2

I presume that you already have Devise and your User model setup and ready to go.

STEP 1
First off, if you haven't already done it, generate Devise registration controller with this command:

rails g devise:controllers users -c=registrations

and let your routes know about it:

# routes.rb

devise_for :users, controllers: {
      registrations: 'users/registrations'
  }
Enter fullscreen mode Exit fullscreen mode

and generate your new registration view, where you will insert ToS agreement checkbox input:

rails g devise:views -v registrations

STEP 2
Now you need to add new column to users table in your database schema, with migration like this:
rails g migration AddTosAgreementToUsers tos_agreement:boolean

the migration file is gonna look like this:

# 20220108144502_add_tos_agreement_to_users.rb

class AddTosAgreementToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :tos_agreement, :boolean
  end
end
Enter fullscreen mode Exit fullscreen mode

migrate the change with rails db:migrate

STEP 3
Add the following to your User model so it forces ToS agreement to be checked before allowing to successfully submit registration form. Also make sure to include on: :create, so this checkup is not forced on when user is just updating the profile.

# users.rb

validates_acceptance_of :tos_agreement, allow_nil: false, on: :create
Enter fullscreen mode Exit fullscreen mode

STEP 4
Permit the 'tos_agreement' param

# users/registrations_controller.rb

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:tos_agreement])
  end
Enter fullscreen mode Exit fullscreen mode

STEP 5
Add the checkbox input to your new registration view. I use link_to method to insert a link leading to my pre-created ToS page.
Terms of Service Checkbox Preview

# views/devise/registrations/new.html.haml

= f.input :tos_agreement, as: :boolean,
         label: "I agree to #{link_to 'Terms of Service',
           terms_of_service_path, target: '_blank'}".html_safe
Enter fullscreen mode Exit fullscreen mode

That's it, now you should have a nice functionality that will force your app users to agree to your terms before creating new account.

Top comments (3)

Collapse
 
raynawara profile image
Raymond J Nawara • Edited on

I really liked your tutorial but can you show your ToS code, view and route, for the page to create a checkbox?

Collapse
 
zilton7 profile image
Zil Norvilis • Edited on

Sure, here you go gist.github.com/zilton7/f4e6b50abd...
and route just contains a simple:
get '/privacy-policy', to: 'static#privacy_policy'

Collapse
 
daniel_vela_135e1f38d81a6 profile image
Daniel Vela

Thanks for the tutorial. It's really helpful and straightforward.

I had to make one add to make your code works for me. In the Step 4 I needed to add this code in the RegistrationController:
before_action :configure_sign_up_params
to call your method to add :tor_agreement permisson.

πŸ‘‹ Hey, my name is Noah and I’m the one who set up this ad. My job is to get you to join DEV, so if you fancy doing me a favor, I’d love for you to create an account.

If you found DEV from searching around, here are a couple of our most popular articles on DEV: