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

エラー メッセージ: ここに画像の説明を入力

この関数の目的は、顧客が使用しているブラウザーを browser 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 に答える