【问题标题】:Refactor the code to reduce Assignment Branch Condition size重构代码以减少分配分支条件的大小
【发布时间】:2020-03-24 21:53:57
【问题描述】:

我正在开发一个 Rails Web 应用程序。但是当我运行 rubocop 来检查代码时。它说下面方法的ABC(分配分支条件)大小太高。虽然我是 Ruby on Rails 的新手,但有人可以给我一些建议来重构这段代码吗?有关更多详细信息,我正在实施第三方身份验证,允许用户通过 facebook 或 google 等登录。

谢谢

  def self.from_omniauth auth, current_user
    identity = Identity.find_by(provider: auth.provider, uid: auth.id)
                       .first_or_initialize
    if identity.user.blank?
      user = current_user || User.find_by("email = ?",
                                          auth["info"]["email"])
      if user.blank?
        user = User.new
        user.password = Devise.friendly_token[0, 10]
        user.name = auth.info.name
        user.email = auth.info.email
        user.picture = auth.info.image
        return user.save(validate: false) if auth.provider == "twitter"

        user.save
      end
      identity.user_id = user.id
      identity.save
    end
    identity.user
  end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5


    【解决方案1】:
    
      def self.from_omniauth auth, current_user
        identity = Identity.find_by(provider: auth.provider, uid: auth.id)
                           .first_or_initialize
        if identity.user.blank?
          user = current_user || User.find_by("email = ?",
                                              auth["info"]["email"])
          create_user(auth) if user.blank?
    
          identity.user_id = user.id
          identity.save
        end
        identity.user
      end
    
      def self.create_user(auth)
        user = User.new
        user.password = Devise.friendly_token[0, 10]
        user.name = auth.info.name
        user.email = auth.info.email
        user.picture = auth.info.image
        return user.save(validate: false) if auth.provider == "twitter"
    
        user.save
      end
    

    你可以试试。但是,如果确实需要复杂性,您可以设置注释以忽略该警察# rubocop:disable ABC (Assignment Branch Condition),或者无论该警察的实际名称是什么。如果您觉得尺寸设置太低,您也可以配置 ABC 尺寸

    【讨论】:

    • 这很好用,一个小的更正是 create_user 方法需要自己。在 from_omniauth 中调用。谢谢,我已经解决了。
    【解决方案2】:

    我没有收到您所说的任何错误,因此您可能应该尝试 # rubocop:disable ABC

    当我保存它时,它在参数中添加了括号

    def self.from_omniauth(auth, current_user)
      identity = Identity.find_by(provider: auth.provider, uid: auth.id)
                         .first_or_initialize
      if identity.user.blank?
        user = current_user || User.find_by("email = ?",
                                            auth["info"]["email"])
        if user.blank?
          user = User.new
          user.password = Devise.friendly_token[0, 10]
          user.name = auth.info.name
          user.email = auth.info.email
          user.picture = auth.info.image
          return user.save(validate: false) if auth.provider == "twitter"
    
          user.save
        end
        identity.user_id = user.id
        identity.save
      end
      identity.user
    end
    

    【讨论】:

    • 感谢您的评论,我已经将代码重构为上面的评论。
    猜你喜欢
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 2015-05-24
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多