Страницы

Поиск по вопросам

вторник, 25 июня 2019 г.

Как разбить код, чтобы MethodLength был хотя бы 15

Есть консерн:
module Omniauthable extend ActiveSupport::Concern included do def self.find_for_oauth(auth) authorization = Authorization.where(provider: auth.provider, uid: auth.uid.to_s).first return authorization.user if authorization
if auth.info.try(:email) email = auth.info[:email] else return false end
user = User.where(email: email).first if user user.create_authorization(auth) else password = Devise.friendly_token[0, 20] user = User.new(email: email, password: password, password_confirmation: password) if user.valid? user.save! user.create_authorization(auth) else return false end end user end
def create_authorization(auth) authorizations.create(provider: auth.provider, uid: auth.uid) end end end
Нужно разделить self.find_for_oauth(auth), чтобы количество строк в методе было хотя бы 15.


Ответ

Я бы переписал так:
module Omniauthable extend ActiveSupport::Concern included do def self.find_for_oauth(auth) authorization = Authorization.where(provider: auth.provider, uid: auth.uid.to_s).first if authorization authorization.user else @email = auth.info.try(:email) find_user # ищем пользователя create_user unless @user # если не находим, то создаем auth_user(auth) # пытаемся авторизовать и возвращаем либо nil либо пользователя end end
def create_authorization(auth) authorizations.create(provider: auth.provider, uid: auth.uid) end private # скрываем служебные методы
def self.find_user @user = User.where(email: @email).first if @email end
def self.create_user password = Devise.friendly_token[0, 20] udata = { email: @email, password: password, password_confirmation: password } user = User.create(udata) # здесь происходит валидация и сохранение @user = user if user.errors.count == 0 # если после создания нет ошибок, то объявляем переменную экземпляра end
def self.auth_user(auth) if @user # если в предыдущих методах был найден/создан пользователь, если @user = nil(не существует, то nil вернется из метода) @user.create_authorization(auth) @user end end end end

Комментариев нет:

Отправить комментарий