module Devise::Models::SmsConfirmable
Public Class Methods
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 20 def initialize(*args, &block) @bypass_sms_confirmation_postpone = false @skip_sms_reconfirmation_in_callback = false @sms_reconfirmation_required = false @skip_sms_confirmation_notification = false @raw_sms_confirmation_token = nil super end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 29 def self.required_fields(klass) required_methods = [:sms_confirmed_at, :sms_confirmation_sent_at, :sms_confirmation_token] required_methods << :unconfirmed_phone if klass.sms_reconfirmable required_methods end
Public Instance Methods
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 94 def active_for_authentication? super && (!sms_confirmation_required? || sms_confirmed? || sms_confirmation_period_valid?) end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 103 def generate_sms_confirmation_token! generate_sms_confirmation_token && save(validate: false) end
override Devise::Models::Confirmable#pending_sms_reconfirmation?
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 108 def pending_sms_reconfirmation? self.class.sms_reconfirmable && unconfirmed_phone.present? end
Resend confirmation token. Regenerates the token if the period is expired.
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 88 def resend_sms_confirmation_instructions pending_any_sms_confirmation do send_sms_confirmation_instructions end end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 99 def send_phone_changed_notification send_sms_devise_notification(:phone_changed, to: phone_before_last_save) end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 77 def send_sms_confirmation_instructions unless @raw_sms_confirmation_token generate_sms_confirmation_token! end opts = pending_sms_reconfirmation? ? { to: unconfirmed_phone } : { } send_sms_devise_notification(:confirmation_instructions, @raw_sms_confirmation_token, opts) end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 65 def send_sms_reconfirmation_instructions @sms_reconfirmation_required = false unless @skip_confirmation_notification send_sms_confirmation_instructions end end
If you don't want confirmation to be sent on create, neither a code to be generated, call skip_sms_confirmation!
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 114 def skip_sms_confirmation! self.sms_confirmed_at = Time.now.utc end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 73 def skip_sms_confirmation_notification! @skip_confirmation_notification = true end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 118 def skip_sms_reconfirmation! @bypass_sms_confirmation_postpone = true end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 35 def sms_confirm(args={}) pending_any_sms_confirmation do if sms_confirmation_period_expired? self.errors.add(:phone, :sms_confirmation_period_expired, period: Devise::TimeInflector.time_ago_in_words(self.class.sms_confirm_within.ago)) return false end self.sms_confirmed_at = Time.now.utc saved = if pending_sms_reconfirmation? skip_sms_reconfirmation! self.phone = unconfirmed_phone self.unconfirmed_phone = nil save(validate: true, context: args[:context]) else save(validate: args[:ensure_valid] == true, context: args[:context]) end after_sms_confirmation if saved saved end end
Verifies whether a user is sms-confirmed or not
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 61 def sms_confirmed? !!sms_confirmed_at end
Protected Instance Methods
A callback initiated after successfully confirming. This can be used to insert your own logic that is only run after the user successfully confirms.
Example:
def after_sms_confirmation self.update_attribute(:invite_code, nil) end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 145 def after_sms_confirmation end
Generates a new random token for confirmation, and stores the time this token is being generated in sms_confirmation_sent_at
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 162 def generate_sms_confirmation_token if self.sms_confirmation_token && !sms_confirmation_period_expired? @raw_sms_confirmation_token = self.sms_confirmation_token else self.sms_confirmation_token = @raw_sms_confirmation_token = Devise.friendly_token self.sms_confirmation_sent_at = Time.now.utc end end
Checks whether the record requires any confirmation.
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 172 def pending_any_sms_confirmation if (!sms_confirmed? || pending_sms_reconfirmation?) yield else self.errors.add(:phone, :already_confirmed) false end end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 181 def postpone_phone_change? postpone = self.class.sms_reconfirmable && will_save_change_to_phone? && !@bypass_sms_confirmation_postpone && self.phone.present? && (!@skip_sms_reconfirmation_in_callback || !self.phone_in_database.nil?) @bypass_sms_confirmation_postpone = false postpone end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 200 def postpone_phone_change_until_confirmation_and_regenerate_sms_confirmation_token @sms_reconfirmation_required = true self.unconfirmed_phone = self.phone self.phone = self.phone_in_database self.sms_confirmation_token = nil generate_sms_confirmation_token end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 148 def send_on_create_sms_confirmation_instructions send_sms_confirmation_instructions end
With reconfirmable, notify the original email when the user first requests the email change, instead of when the change is confirmed.
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 210 def send_phone_changed_notification? self.class.sms_reconfirmable && self.class.send_phone_changed_notification && sms_reconfirmation_required? end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 192 def send_sms_confirmation_notification? sms_confirmation_required? && !@skip_confirmation_notification && self.phone.present? end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 124 def skip_sms_reconfirmation_in_callback! @skip_sms_reconfirmation_in_callback = true end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 156 def sms_confirmation_period_expired? self.class.sms_confirm_within && self.sms_confirmation_sent_at && (Time.now.utc > self.sms_confirmation_sent_at.utc + self.class.sms_confirm_within) end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 128 def sms_confirmation_period_valid? return true if self.class.allow_sms_unconfirmed_access_for.nil? return false if self.class.allow_sms_unconfirmed_access_for == 0.days sms_confirmation_sent_at && sms_confirmation_sent_at.utc >= self.class.allow_sms_unconfirmed_access_for.ago end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 152 def sms_confirmation_required? !sms_confirmed? end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 196 def sms_reconfirmation_required? self.class.sms_reconfirmable && @sms_reconfirmation_required && (self.phone.present? || self.unconfirmed_phone.present?) end