Skip to content

Commit f051561

Browse files
committed
Add account activation
1 parent ae7bde8 commit f051561

24 files changed

+223
-65
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class AccountActivationsController < ApplicationController
2+
def edit
3+
user = User.find_by(email: params[:email])
4+
if user && !user.activated? && user.authenticated?(:activation, params[:id])
5+
user.activate
6+
log_in user
7+
flash[:success] = "Account activated!"
8+
redirect_to user
9+
else
10+
flash[:danger] = "Invalid activation link"
11+
redirect_to root_url
12+
end
13+
end
14+
end

app/controllers/sessions_controller.rb

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,18 @@ def new
55
def create
66
user = User.find_by(email: params[:session][:email].downcase)
77
if user && user.authenticate(params[:session][:password])
8-
forwarding_url = session[:forwarding_url]
9-
reset_session
10-
params[:session][:remember_me] == "1" ? remember(user) : forget(user)
11-
log_in user
12-
redirect_to forwarding_url || user
8+
if user.activated?
9+
forwarding_url = session[:forwarding_url]
10+
reset_session
11+
params[:session][:remember_me] == "1" ? remember(user) : forget(user)
12+
log_in user
13+
redirect_to forwarding_url || user
14+
else
15+
message = "Account not activated. "
16+
message += "Check your email for the activation link."
17+
flash[:warning] = message
18+
redirect_to root_url
19+
end
1320
else
1421
flash.now[:danger] = "Invalid email/password combination"
1522
render "new", status: :unprocessable_entity

app/controllers/users_controller.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ def new
1414
def create
1515
@user = User.new(user_params)
1616
if @user.save
17-
reset_session
18-
log_in @user
19-
flash[:success] = "Welcome to the Sample App!"
20-
redirect_to @user
17+
@user.send_activation_email
18+
flash[:info] = "Please check your email to activate your account."
19+
redirect_to root_url
2120
else
2221
render "new", status: :unprocessable_entity
2322
end
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module AccountActivationsHelper
2+
end

app/helpers/sessions_helper.rb

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,14 @@ def remember(user)
1515
cookies.permanent[:remember_token] = user.remember_token
1616
end
1717

18-
# Returns the user corresponding to the remember token cookie.
18+
# Returns the current logged-in user (if any).
1919
def current_user
2020
if (user_id = session[:user_id])
2121
user = User.find_by(id: user_id)
22-
if user && session[:session_token] == user.session_token
23-
@current_user = user
24-
end
22+
@current_user ||= user if session[:session_token] == user.session_token
2523
elsif (user_id = cookies.encrypted[:user_id])
2624
user = User.find_by(id: user_id)
27-
if user && user.authenticated?(cookies[:remember_token])
25+
if user && user.authenticated?(:remember, cookies[:remember_token])
2826
log_in user
2927
@current_user = user
3028
end

app/mailers/application_mailer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
class ApplicationMailer < ActionMailer::Base
2-
default from: "from@example.com"
2+
default from: "user@realdomain.com"
33
layout "mailer"
44
end

app/mailers/user_mailer.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class UserMailer < ApplicationMailer
2+
# Subject can be set in your I18n file at config/locales/en.yml
3+
# with the following lookup:
4+
#
5+
# en.user_mailer.account_activation.subject
6+
#
7+
def account_activation(user)
8+
@user = user
9+
mail to: user.email, subject: "Account activation"
10+
end
11+
12+
def password_reset
13+
@greeting = "Hi"
14+
mail to: "[email protected]"
15+
end
16+
end

app/models/user.rb

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class User < ApplicationRecord
2-
attr_accessor :remember_token
3-
before_save { self.email = email.downcase }
2+
attr_accessor :remember_token, :activation_token
3+
before_save :downcase_email
4+
before_create :create_activation_digest
45
validates :name, presence: true, length: { maximum: 50 }
56
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
67
validates :email, presence: true, length: { maximum: 255 },
@@ -32,13 +33,39 @@ def session_token
3233
end
3334

3435
# Returns true if the given token matches the digest.
35-
def authenticated?(remember_token)
36-
return false if remember_digest.nil?
37-
BCrypt::Password.new(remember_digest).is_password?(remember_token)
36+
def authenticated?(attribute, token)
37+
digest = send("#{attribute}_digest")
38+
return false if digest.nil?
39+
BCrypt::Password.new(digest).is_password?(token)
3840
end
3941

4042
# Forgets a user.
4143
def forget
4244
update_attribute(:remember_digest, nil)
4345
end
46+
47+
# Activates an account.
48+
def activate
49+
update_attribute(:activated,
50+
true)
51+
update_attribute(:activated_at, Time.zone.now)
52+
end
53+
54+
# Sends activation email.
55+
def send_activation_email
56+
UserMailer.account_activation(self).deliver_now
57+
end
58+
59+
private
60+
61+
# Converts email to all lowercase.
62+
def downcase_email
63+
self.email = email.downcase
64+
end
65+
66+
# Creates and assigns the activation token and digest.
67+
def create_activation_digest
68+
self.activation_token = User.new_token
69+
self.activation_digest = User.digest(activation_token)
70+
end
4471
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<h1>Sample App</h1>
2+
<p>Hi <%= @user.name %>,</p>
3+
<p>
4+
Welcome to the Sample App! Click on the link below to activate your account:
5+
</p>
6+
<%= link_to "Activate", edit_account_activation_url(@user.activation_token, email: @user.email) %>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Hi <%= @user.name %>,
2+
Welcome to the Sample App! Click on the link below to activate your account:
3+
<%= edit_account_activation_url(@user.activation_token, email: @user.email) %>

0 commit comments

Comments
 (0)