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)


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
330
# File 'lib/devise_invitable/models.rb', line 302

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.merge(validate: false)) 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



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

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



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

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

#after_invitation_created(*args, &blk) ⇒ Object



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

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

#before_invitation_accepted(*args, &blk) ⇒ Object



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

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

#before_invitation_created(*args, &blk) ⇒ Object

Callback convenience methods



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

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

#find_by_invitation_token(original_token, only_valid) ⇒ Object



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

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



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

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



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

def invite_key_fields
  invite_key.keys
end

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



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

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