1

这是阻塞 rubocop 的代码块:

  def self.browser_not_supported(browser)
    return true if browser.chrome? && browser.version.to_i < AppConfig.requirements['browser_google'].to_i
    return true if browser.firefox? && browser.version.to_i < AppConfig.requirements['browser_firefox'].to_i
    return true if browser.safari? && browser.version.to_i < AppConfig.requirements['browser_safari'].to_i
    return true if browser.ie? && browser.version.to_i < AppConfig.requirements['browser_msft'].to_i
    return true unless browser.modern?
  end

错误信息: 在此处输入图像描述

此函数的目标是通过浏览器 gem 确定客户正在使用哪个浏览器。如果客户使用的是旧版浏览器,我们会将他们踢出应用程序,要求他们升级。现在,我有这个忽略,所以警察不会窒息,但我很好奇那里的专家会如何修改这个。

请注意,此代码也用于初始化程序:

Rails.configuration.middleware.use Browser::Middleware do
    redirect_to '/error/browser-upgrade-required' if ApplicationHelper.browser_not_supported(browser)
end
4

2 回答 2

1

我建议将您的大方法拆分为一堆较小的方法并使用实例变量来帮助减少重复:

class BrowserChecker
  def initialize(browser)
    @browser = browser
    @version = browser.version.to_i
  end

  def browser_not_supported?
    !@browser.modern? || chrome_bad? || firefox_bad? || io_bad?
  end

  private

  def chrome_bad?
    @browser.chrome? && @version < AppConfig.requirements['browser_google'].to_i
  end

  def firefox_bad?
    @browser.firefox? && @version < AppConfig.requirements['browser_firefox'].to_i
  end

  def safari_bad?
    @browser.safari? && @version < AppConfig.requirements['browser_safari'].to_i
  end

  def ie_bad?
    @browser.ie? && @version < AppConfig.requirements['browser_msft'].to_i
  end
end


# called like this
BrowserChecker.new(some_browser_object)

作为一种风格偏好,我还为每个方法附加了一个问号,以表明它们返回布尔值。

您还可以使用一些元编程魔法让 ruby[browser]_bad?​​ 为您编写函数,但最终可能会降低可读性:

class BrowserChecker
  def initialize(browser)
    @browser = browser
  end


  def browser_not_supported
    !@browser.modern? || chrome_bad? || firefox_bad? || io_bad?
  end

  ['google', 'firefox', 'safari', 'msft'].each do |browser|
    define_method "#{browser}_bad?".to_sym do
      @browser.send("#{browser}?".to_sym) && @version < AppConfig.requirements["browser_#{browser}"].to_i
    end
  end
end

我还没有运行这段代码,所以请原谅一些错别字。

于 2016-02-02T02:47:55.910 回答
0

我可能会做这样的事情。Eval在这种情况下可以安全地使用,因为没有对用户提交的任何内容进行评估。这都是你控制的代码。

def self.browser_not_supported(browser)
  unsupported?(browser) || !browser.modern?
end

private

def self.unsupported?(browser)
  browsers.any? do |name, tech_name|
    if eval("#{browser}.#{name}?")
      browser.version.to_i < AppConfig.requirements[tech_name].to_i
    end
  end
end

def self.browsers
  {
    chrome: 'browser_google',
    firefox: 'browser_firefox',
    safari: 'browser_safari',
    ie: 'browser_msft'
  }
end
于 2016-02-02T03:26:08.483 回答