module Devise::Models::Approvable

Public Class Methods

included(base) click to toggle source
# File lib/approvable.rb, line 7
def self.included(base)
  base.class_eval do
    extend ClassMethods

    before_create :generate_approval_token, :if => :approval_required?
    # after_create  :send_approval_instructions unless approved?
  end
end

Public Instance Methods

active?() click to toggle source

Overwrites active? from Devise::Models::Activatable for confirmation by verifying whether an user is active to sign in or not. If the user is already confirmed, it should never be blocked. Otherwise we need to calculate if the confirm time has not expired for this user.

Calls superclass method
# File lib/approvable.rb, line 46
def active?
  super && (!confirmation_required? || confirmed? || confirmation_period_valid?)
end
approve!() click to toggle source
# File lib/approvable.rb, line 67
def approve!
  self.is_approved = true
  self.approval_token = nil
  send_confirmation_instructions
  save(:validate => false)
end
approved?() click to toggle source

Verifies whether a user is confirmed or not

# File lib/approvable.rb, line 75
def approved?
  self.is_approved
end
confirm!() click to toggle source

Confirm a user by setting it’s confirmed_at to actual time. If the user is already confirmed, add en error to email field

# File lib/approvable.rb, line 18
def confirm!
  unless_confirmed do
    self.confirmation_token = nil
    self.confirmed_at = Time.now
    save(false)
  end
end
confirmed?() click to toggle source

Verifies whether a user is confirmed or not

# File lib/approvable.rb, line 27
def confirmed?
  !new_record? && !confirmed_at.nil?
end
inactive_message() click to toggle source

The message to be shown if the account is inactive.

Calls superclass method
# File lib/approvable.rb, line 51
def inactive_message
  !confirmed? ? :unconfirmed : super
end
resend_confirmation_token() click to toggle source

Resend confirmation token. This method does not need to generate a new token.

# File lib/approvable.rb, line 38
def resend_confirmation_token
  unless_confirmed { send_confirmation_instructions }
end
send_approval_instructions() click to toggle source

Send confirmation instructions by email

# File lib/approvable.rb, line 85
def send_approval_instructions
  generate_approval_token if self.approval_token.nil?
  ::DeviseMailer.deliver_approval_instructions(self)
end
send_confirmation_instructions() click to toggle source

Send confirmation instructions by email

# File lib/approvable.rb, line 32
def send_confirmation_instructions
  generate_confirmation_token if self.confirmation_token.nil?
  ::DeviseMailer.deliver_confirmation_instructions(self)
end
skip_approval!() click to toggle source
# File lib/approvable.rb, line 79
def skip_approval!
  self.is_approved = true
  @skip_approval = true
end
skip_confirm_and_approve!() click to toggle source
# File lib/approvable.rb, line 62
def skip_confirm_and_approve!
  skip_confirmation!
  skip_approval!
end
skip_confirmation!() click to toggle source

If you don’t want confirmation to be sent on create, neither a code to be generated, call skip_confirmation!

# File lib/approvable.rb, line 57
def skip_confirmation!
  self.confirmed_at  = Time.now
  @skip_confirmation = true
end

Protected Instance Methods

approval_required?() click to toggle source
# File lib/approvable.rb, line 97
def approval_required?
  !@skip_approval
end
confirmation_period_valid?() click to toggle source

Checks if the confirmation for the user is within the limit time. We do this by calculating if the difference between today and the confirmation sent date does not exceed the confirm in time configured. Confirm_in is a model configuration, must always be an integer value.

Example:

# confirm_within = 1.day and confirmation_sent_at = today
confirmation_period_valid?   # returns true

# confirm_within = 5.days and confirmation_sent_at = 4.days.ago
confirmation_period_valid?   # returns true

# confirm_within = 5.days and confirmation_sent_at = 5.days.ago
confirmation_period_valid?   # returns false

# confirm_within = 0.days
confirmation_period_valid?   # will always return false
# File lib/approvable.rb, line 120
def confirmation_period_valid?
  confirmation_sent_at && confirmation_sent_at.utc >= self.class.confirm_within.ago
end
confirmation_required?() click to toggle source

Callback to overwrite if confirmation is required or not.

# File lib/approvable.rb, line 93
def confirmation_required?
  !@skip_confirmation
end
generate_approval_token() click to toggle source
# File lib/approvable.rb, line 143
def generate_approval_token
  self.is_approved = false
  self.approval_token = Devise.friendly_token
  self.approval_sent_at = Time.now.utc
end
generate_confirmation_token() click to toggle source

Generates a new random token for confirmation, and stores the time this token is being generated

# File lib/approvable.rb, line 137
def generate_confirmation_token
  self.confirmed_at = nil
  self.confirmation_token = Devise.friendly_token
  self.confirmation_sent_at = Time.now.utc
end
unless_confirmed() { || ... } click to toggle source

Checks whether the record is confirmed or not, yielding to the block if it’s already confirmed, otherwise adds an error to email.

# File lib/approvable.rb, line 126
def unless_confirmed
  unless confirmed?
    yield
  else
    self.class.add_error_on(self, :email, :already_confirmed)
    false
  end
end