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

Defined in:
lib/devise_invitable/model.rb

Instance Method Summary collapse

Instance Method Details

#_invite(attributes = {}, invited_by = nil) {|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)


226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/devise_invitable/model.rb', line 226

def _invite(attributes={}, invited_by=nil, &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

  invitable.skip_password = true
  invitable.valid? if self.validate_on_invite
  if invitable.new_record?
    invitable.clear_errors_on_valid_keys if !self.validate_on_invite
  elsif !invitable.invited_to_sign_up? || !self.resend_invitation
    invite_key_array.each do |key|
      invitable.errors.add(key, :taken)
    end
  end

  yield invitable if block_given?
  mail = invitable.invite! 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



269
270
271
272
273
274
275
276
277
# File 'lib/devise_invitable/model.rb', line 269

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



301
302
303
# File 'lib/devise_invitable/model.rb', line 301

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

#before_invitation_accepted(*args, &blk) ⇒ Object

Callback convenience methods



297
298
299
# File 'lib/devise_invitable/model.rb', line 297

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

#find_by_invitation_token(original_token, only_valid) ⇒ Object



279
280
281
282
283
284
285
286
287
288
289
# File 'lib/devise_invitable/model.rb', line 279

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)
  if !invitable.persisted? && Devise.allow_insecure_token_lookup
    invitable = find_or_initialize_with_error_by(:invitation_token, original_token)
  end
  invitable.errors.add(:invitation_token, :invalid) if invitable.invitation_token && invitable.persisted? && !invitable.valid_invitation?
  invitable.invitation_token = original_token
  invitable unless only_valid && invitable.errors.present?
end

#invitation_tokenObject

Generate a token checking if one does not already exist in the database.



292
293
294
# File 'lib/devise_invitable/model.rb', line 292

def invitation_token
  generate_token(:invitation_token)
end

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



254
255
256
257
# File 'lib/devise_invitable/model.rb', line 254

def invite!(attributes={}, invited_by=nil, &block)
  invitable, mail = _invite(attributes.with_indifferent_access, invited_by, &block)
  invitable
end

#invite_key_fieldsObject

Return fields to invite



215
216
217
# File 'lib/devise_invitable/model.rb', line 215

def invite_key_fields
  invite_key.keys
end

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



259
260
261
262
# File 'lib/devise_invitable/model.rb', line 259

def invite_mail!(attributes={}, invited_by=nil, &block)
  invitable, mail = _invite(attributes, invited_by, &block)
  mail
end