class Devise::MultiEmail::ParentModelManager

Public Class Methods

new(parent_record) click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 7
def initialize(parent_record)
  @parent_record = parent_record
end

Public Instance Methods

change_primary_email_to(new_email, options = {}) click to toggle source

:allow_unconfirmed option sets this email record to primary :skip_confirmations option confirms this email record (without saving) @see `set_primary_record_to`

# File lib/devise/multi_email/parent_model_manager.rb, line 31
def change_primary_email_to(new_email, options = {})
  # mark none as primary when set to nil
  if new_email.nil?
    filtered_emails.each { |item| item.primary = false }

  # select or build an email record
  else
    record = find_or_build_for_email(new_email)

    if record.try(:confirmed?) || primary_email_record.nil? || options[:allow_unconfirmed]
      set_primary_record_to(record, options)
    end
  end

  record
end
confirmed_emails() click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 68
def confirmed_emails
  filtered_emails.select { |record| record.try(:confirmed?) }
end
current_email_record() click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 11
def current_email_record
  login_email_record || primary_email_record
end
emails() click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 59
def emails
  @parent_record.__send__(@parent_record.class.multi_email_association.name)
end
filtered_emails(options = {}) click to toggle source

Gets the email records that have not been deleted

# File lib/devise/multi_email/parent_model_manager.rb, line 64
def filtered_emails(options = {})
  emails.to_a.reject(&:destroyed?).reject(&:marked_for_destruction?)
end
find_or_build_for_email(email) click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 53
def find_or_build_for_email(email)
  formatted_email = format_email(email)
  record = filtered_emails.find { |item| item.email == formatted_email }
  record || emails.build(email: formatted_email)
end
format_email(email) click to toggle source

Use Devise formatting settings for emails

# File lib/devise/multi_email/parent_model_manager.rb, line 49
def format_email(email)
  @parent_record.class.__send__(:devise_parameter_filter).filter(email: email)[:email]
end
login_email_record() click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 15
def login_email_record
  if @parent_record.current_login_email.present?
    formatted_email = format_email(@parent_record.current_login_email)
    filtered_emails.find { |item| item.email == formatted_email }
  end
end
primary_email_record() click to toggle source

Gets the primary email record.

# File lib/devise/multi_email/parent_model_manager.rb, line 23
def primary_email_record
  filtered_emails.find(&:primary?)
end
unconfirmed_emails() click to toggle source
# File lib/devise/multi_email/parent_model_manager.rb, line 72
def unconfirmed_emails
  filtered_emails.reject { |record| record.try(:confirmed?) }
end

Protected Instance Methods

set_primary_record_to(record, options = {}) click to toggle source

:skip_confirmations option confirms this email record (without saving)

# File lib/devise/multi_email/parent_model_manager.rb, line 79
def set_primary_record_to(record, options = {})
  # Toggle primary flag for all emails
  filtered_emails.each { |other| other.primary = (other.email == record.email) }

  if options[:skip_confirmations]
    record.try(:skip_confirmation!)
    record.try(:skip_reconfirmation!)
  end
end