赋值分支from_omniauth的条件大小太高

时间:2016-01-05 10:25:25

标签: ruby ruby-on-rails-4

如何修复以下代码

的分配分支条件警告
      def self.from_omniauth(ominiauth_data)
        data = ominiauth_data.info
        if data['email'].present?
          user = User.where(email: data['email']).try(:last)
        else
          if ominiauth_data['provider'] == 'twitter'
            uname = ominiauth_data.info['nickname'].delete(' ')
          elsif ominiauth_data['provider'] == 'facebook'
            uname = ominiauth_data.info['name'].delete(' ')
          elsif ominiauth_data['provider'] == 'google_oauth2'
            uname = ominiauth_data.info['name'].delete(' ')
          end
          user = User.where(username: uname).try(:last)
        end
     end

2 个答案:

答案 0 :(得分:0)

  def self.from_omniauth(ominiauth_data)
    if ominiauth_data.info['email'].present?
      user = User.where(email: data['email']).try(:last)
    else
      uname = case ominiauth_data['provider']
              when 'twitter' then ominiauth_data.info['nickname'].delete(' ')
              when 'facebook' then ominiauth_data.info['name'].delete(' ')
              when 'google_oauth2' then ominiauth_data.info['name'].delete(' ')
              end
      user = User.where(username: uname).try(:last)
    end
 end

或者,甚至更好:

  def self.from_omniauth(ominiauth_data)
    if ominiauth_data.info['email'].present?
      user = User.where(email: data['email']).try(:last)
    else
      uname = ominiauth_data.info[
                case ominiauth_data['provider']
                when 'twitter' then 'nickname'
                when 'facebook' then 'name'
                when 'google_oauth2' then 'name'
                end
              ].delete(' ')
      user = User.where(username: uname).try(:last)
    end
 end

答案 1 :(得分:0)

正如您所见,twitter还提供name see hear

nickname已经没有空格!!!)

所以你可以用下一种方式编写代码:

def self.from_omniauth(ominiauth_data)
    data = ominiauth_data.info
    if data['email'].present?
      user = User.where(email: data['email']).try(:last)
      # if you have uniq user than use
      # user = User.find_by(email: data['email'])
    else
      uname = data.info['nickname'].delete(' ')
      user = User.where(username: uname).try(:last)
      # if you have uniq user than use
      # user = User.find_by(username: uname)
    end
 end

修改

顺便说一句 改变原始用户名称的坏主意,为什么? 例如: Twitter不提供电子邮件,您可以按名称识别用户。但Oleg SobchukOlegSobchuk可能是两个不同的用户。

更好地保存privideruid。这两个属性UNIQ。你可以使用它们像主要和其他类似帮助者(例如电子邮件)