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'
}
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
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
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
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.
# 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
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)
I really liked your tutorial but can you show your ToS code, view and route, for the page to create a checkbox?
Sure, here you go gist.github.com/zilton7/f4e6b50abd...
and route just contains a simple:
get '/privacy-policy', to: 'static#privacy_policy'
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.