Skip to content

Instantly share code, notes, and snippets.

@saroar
Last active June 21, 2016 21:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saroar/065029a05e79d086d71f95270cc55be9 to your computer and use it in GitHub Desktop.
Save saroar/065029a05e79d086d71f95270cc55be9 to your computer and use it in GitHub Desktop.
self.from_omniauth(auth, organisation) REFACTOR
# 3. Please refactor User#from_omniauth method. Currently it's hard to read. Please make it more clear.
def self.from_omniauth(auth, organization)
user = User.where(provider: auth.provider, uid: auth.uid).first
if user
return user
else
registered_user = User.where(email: auth.info.email).first
if registered_user
return registered_user
else
user = User.create(
provider: auth.provider,
uid: auth.uid,
name: auth.info.name,
email: auth.info.email,
password: Devise.friendly_token[0, 20],
organization: organization
)
end
end
end
# 1st refactor
def self.from_omniauth(auth, organization)
user = User.where(provider: auth.provider, uid: auth.uid).first
registered_user = User.where(email: auth.info.email).first
return user if user
return registered_user if registered_user
User.create(
provider: auth.provider,
uid: auth.uid,
name: auth.info.name,
email: auth.info.email,
password: Devise.friendly_token[0, 20],
organization: organization
)
end
@saroar
Copy link
Author

saroar commented Jun 19, 2016

3rd Version

class OmniauthUser
  attr_reader :auth, :organization

  def self.initialize(auth, organization)
    @auth = auth
    @organization = organization
  end
  ## this initialise does not work

  def self.find_or_create(auth, organization)
    omniauth_user = User.where(provider: auth.provider, uid: auth.uid).first
    registered_user = User.where(email: auth.info.email).first


    return omniauth_user if omniauth_user
    return registered_user if registered_user
    create_ominauth_user(auth, organization)
  end

  private

  # def self.omniauth_user(auth, organization)
  #   @omniauth_user ||= User.where(provider: auth.provider, uid: auth.provider).first
  # end
  #
  # def self.registered_user(auth, organization)
  #   @registered_user ||= User.where(email: auth.info.email).first
  # end

  def self.create_ominauth_user(auth, organization)
    User.create(
       provider: auth.provider,
       uid: auth.uid,
       name: auth.info.name,
       email: auth.info.email,
       password: Devise.friendly_token[0, 20],
       organization: organization
   )
  end
end

@saroar
Copy link
Author

saroar commented Jun 19, 2016

Final code

class OmniauthUser
  attr_reader :auth, :organization

  def initialize(auth, organization)
    @auth = auth
    @organization = organization
  end

  def find_or_create
    if omniauth_user
      omniauth_user
    elsif registered_user
      registered_user
    else
      create_omniauth_user
    end
  end

  private

  def omniauth_user
    User.where(provider: auth.provider, uid: auth.uid).first
  end

  def registered_user
    User.where(email: auth.info.email).first
  end

  def create_omniauth_user
    User.create(
       provider: auth.provider,
       uid: auth.uid,
       name: auth.info.name,
       email: auth.info.email,
       password: Devise.friendly_token[0, 20],
       organization: organization
   )
  end
end

@trendwithin
Copy link

Saw your question on gitter, any reason why you aren't simply using the default in the Devise README on OmniAuth?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment