Devise
Devise is an authentication solution which can be used to provide login and logout functionality for your users. This tutorial will explain how to create a Rails app from scratch, with Devise authentication.
Let’s begin
Start by creating a new Rails application. I will name my app blog
, however, feel free to name yours as you wish. Make sure you have Ruby, SQLite3, Node.js, Yarn and Rails installed. You can verify these installations using the following commands.
ruby --version
sqlite3 --version
node --version
yarn --version
rails --version
Once you have verified the installation of the prerequisites, create a new Rails app.
rails new blog
Verify that your app is working by starting the Rails server.
bin/rails s
Do Some Modeling
Our simple app will need one model to work properly, a User. The User is the entity which will login and logout from our app. Generate the User model using the Rails generator.
bin/rails g model User first_name:string last_name:string
A file will be created, named app/models/user.rb
. Rails will also generate a migration. Let’s run that migration.
bin/rails g db:migrate
The migration will create a table in the sqlite3
database. You can view that table by loading the database
sqlite3 db/development.sqlite3
In the Sqlite3 intepreter, enter the following command
>> .tables
Voila! There is a users table.
Integrate Devise
Now we can integrate Devise. Add the following to your Gemfile
:
gem 'devise'
Install the Gem using bundle install
. Now run the Devise generator:
bin/rails g devise:install
The generator will provide a set of instructions to your console. The first thing we need to do is add an option to config/environments/development.rb
.
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
The Devise generator will also have created a migration for us. Let’s run that migration using the command bin/rails db:migrate
.
Get it Under Control
Next, let’s create a home
controller, and an associated route in config/routes.rb
. Create a new file and save it to app/controllers/home_controller.rb
. Notice the authenticate_user!
method which we are specifying at the top of the controller. By doing this, we are ensuring that the user needs to be logged in to view the content.
# app/controllers/home_controller.rb
class HomeController < ApplicationController
before_action :authenticate_user!
def index
render "home/index"
end
end
We will also need to create an associated view, app/views/home/index.html.erb
. Let’s populate this file with the following content. Notice the ERB tag, which is going to pull a variable from our controller into the view. In this case, I want to pull the current_user
so that we can verify in the view that there is a current_user selected.
<h1>Welcome to My Amazing Website!</h1>
<%= current_user %>
Finally, let’s add notices to our app/views/layouts/application.html.erb
. Notice I abbreviated the middle of the file to keep this article short. Don’t delete anything from your file, just copy the two lines with notice
and alert
.
<html>
...
<body>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
</body>
</html>
Look at the View
Finally, let’s use Devise to generate some login and signup views!
bin/rails g devise:views
Launch the server and enjoy your new app!
bin/rails s