class User < ApplicationRecord after_create :initialize_room before_save { email.downcase! } has_one :room validates :name, length: { maximum: 24 }, presence: true validates :username, presence: true validates :provider, presence: true validates :email, length: { maximum: 60 }, presence: true, uniqueness: { case_sensitive: false }, format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i } validates :password, length: { minimum: 6 }, allow_nil: true # We don't want to run the validations because they require a user # to have a password. Users who authenticate via omniauth won't. has_secure_password(validations: false) class << self # Generates a user from omniauth. def from_omniauth(auth) user = find_or_initialize_by(uid: auth['uid'], provider: auth['provider']) user.name = send("#{auth['provider']}_name", auth) user.username = send("#{auth['provider']}_username", auth) user.email = send("#{auth['provider']}_email", auth) user.save! user end private # Provider attributes. def twitter_name(auth) auth['info']['name'] end def twitter_username(auth) auth['info']['nickname'] end def twitter_email(auth) auth['info']['email'] end def google_name(auth) auth['info']['name'] end def google_username(auth) auth['info']['email'].split('@').first end def google_email(auth) auth['info']['email'] end end private # Initializes a room for the user. def initialize_room self.room = Room.new self.save! end end