Module: Devise::Models::Invitable::ClassMethods

Defined in:
lib/devise_invitable/models.rb

Instance Method Summary collapse

Instance Method Details

#_invite(attributes = {}, invited_by = nil, options = {}) {|invitable| ... } ⇒ Object

Attempt to find a user by its email. If a record is not found, create a new user and send an invitation to it. If the user is found, return the user with an email already exists error. If the user is found and still has a pending invitation, invitation email is resent unless resend_invitation is set to false. Attributes must contain the user's email, other attributes will be set in the record

Yields:

  • (invitable)

301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# File 'lib/devise_invitable/models.rb', line 301

def _invite(attributes = {}, invited_by = nil, options = {}, &block)
  invite_key_array = invite_key_fields
  attributes_hash = {}
  invite_key_array.each do |k,v|
    attribute = attributes.delete(k)
    attribute = attribute.to_s.strip if strip_whitespace_keys.include?(k)
    attributes_hash[k] = attribute
  end

  invitable = find_or_initialize_with_errors(invite_key_array, attributes_hash)
  invitable.assign_attributes(attributes)
  invitable.invited_by = invited_by
  unless invitable.password || invitable.encrypted_password.present?
    invitable.password = random_password
  end

  invitable.valid? if self.validate_on_invite
  if invitable.new_record?
    invitable.clear_errors_on_valid_keys if !self.validate_on_invite
  elsif invitable.invitation_taken? || !self.resend_invitation
    invite_key_array.each do |key|
      invitable.add_taken_error(key)
    end
  end

  yield invitable if block_given?
  mail = invitable.invite!(nil, options) if invitable.errors.empty?
  [invitable, mail]
end

#accept_invitation!(attributes = {}) ⇒ Object

Attempt to find a user by it's invitation_token to set it's password. If a user is found, reset it's password and automatically try saving the record. If not user is found, returns a new user containing an error in invitation_token attribute. Attributes must contain invitation_token, password and confirmation


345
346
347
348
349
350
351
352
353
# File 'lib/devise_invitable/models.rb', line 345

def accept_invitation!(attributes = {})
  original_token = attributes.delete(:invitation_token)
  invitable = find_by_invitation_token(original_token, false)
  if invitable.errors.empty?
    invitable.assign_attributes(attributes)
    invitable.accept_invitation!
  end
  invitable
end

#after_invitation_accepted(*args, &blk) ⇒ Object


376
377
378
# File 'lib/devise_invitable/models.rb', line 376

def after_invitation_accepted(*args, &blk)
  set_callback(:invitation_accepted, :after, *args, &blk)
end

#after_invitation_created(*args, &blk) ⇒ Object


368
369
370
# File 'lib/devise_invitable/models.rb', line 368

def after_invitation_created(*args, &blk)
  set_callback(:invitation_created, :after, *args, &blk)
end

#before_invitation_accepted(*args, &blk) ⇒ Object


372
373
374
# File 'lib/devise_invitable/models.rb', line 372

def before_invitation_accepted(*args, &blk)
  set_callback(:invitation_accepted, :before, *args, &blk)
end

#before_invitation_created(*args, &blk) ⇒ Object

Callback convenience methods


364
365
366
# File 'lib/devise_invitable/models.rb', line 364

def before_invitation_created(*args, &blk)
  set_callback(:invitation_created, :before, *args, &blk)
end

#find_by_invitation_token(original_token, only_valid) ⇒ Object


355
356
357
358
359
360
361
# File 'lib/devise_invitable/models.rb', line 355

def find_by_invitation_token(original_token, only_valid)
  invitation_token = Devise.token_generator.digest(self, :invitation_token, original_token)

  invitable = find_or_initialize_with_error_by(:invitation_token, invitation_token)
  invitable.errors.add(:invitation_token, :invalid) if invitable.invitation_token && invitable.persisted? && !invitable.valid_invitation?
  invitable unless only_valid && invitable.errors.present?
end

#invite!(attributes = {}, invited_by = nil, options = {}, &block) ⇒ Object


331
332
333
334
# File 'lib/devise_invitable/models.rb', line 331

def invite!(attributes = {}, invited_by = nil, options = {}, &block)
  attr_hash = ActiveSupport::HashWithIndifferentAccess.new(attributes.to_h)
  _invite(attr_hash, invited_by, options, &block).first
end

#invite_key_fieldsObject

Return fields to invite


290
291
292
# File 'lib/devise_invitable/models.rb', line 290

def invite_key_fields
  invite_key.keys
end

#invite_mail!(attributes = {}, invited_by = nil, options = {}, &block) ⇒ Object


336
337
338
# File 'lib/devise_invitable/models.rb', line 336

def invite_mail!(attributes = {}, invited_by = nil, options = {}, &block)
  _invite(attributes, invited_by, options, &block).last
end