【问题标题】:What is the proper ruby way to redo a conditional?重做条件的正确红宝石方法是什么?
【发布时间】:2015-10-09 08:44:19
【问题描述】:

任务是检查联系人页面是否存在并导航到该页面。对于非英文网站,该方法会查找英文页面,然后重新启动以检查联系页面。

我的条件工作正常,但我认为必须是更好的方法:

  # First, I set the @url variable during Booleans.   
  # Checks are either to see if a link exists or if a page exists,
  # (aka no 404 error).
  #
  # Here are two examples:

  # Boolean, returns true if contact link is present.
  def contact_link?
    @url = link_with_href('contact')

    !@url.nil?
  end

  # True if contact page '../contact' does NOT get a 404 error.
  def contact_page?
    @url = page.uri.merge('../contact').to_s
    begin
      true if Mechanize.new.get(@url)
    rescue Mechanize::ResponseCodeError
      false
    end
  end

  # #
  # Now go to the correct page, based off of checks.
  #
  def go_to_contact_page
    1.times do
      case # No redo necessary.
      when contact_link? # True if hyperlink exists
        get(@url)
      when contact_page? # False if 404 error
        get(@url)
      else # Redo is now necessary.
        if english_link? # True if hyperlink exists
          get(@url)
          redo
        elsif en_page? # False if 404 error
          get(@url)
          redo
        elsif english_page? # False if 404 error
          redo
        end
      end
    end
  end

有几件事需要引起您的注意:

  1. 1.times do 是做单个redo 的最佳方式吗? begin 会更好吗?

  2. 了解我在每个检查中都设置了@url 变量,条件分支中的get(@url) 似乎存在冗余。有没有更简洁的方式?

  3. 我写了三遍redo,这似乎也是多余的。有没有办法调用一次并仍然设置@url 变量?

感谢您的帮助!

【问题讨论】:

  • 不确定我是否完全理解这个问题,但您可以将 case 语句中的大小写与逗号结合起来(例如 when contact_link?, contact_page?)。您也不需要 elseif english_link? 块之前。这可以纳入您的案例陈述

标签: ruby conditional redo


【解决方案1】:

这样的东西更易读更干

def english_contact_page
  ..
rescue
  nil
end

def contact_page
  ..
rescue
  nil
end

def get_page
  @url = link_with_href('contact')
  return nil if @url.nil?
  contact_page || english_contact_page  # left side is evaluated first
rescue
  nil
end

【讨论】:

  • 首先评估左侧,即a || b首先评估a
  • 嗨@peter,有时没有联系链接。 return nil if @url.nil? 不会真的退出该方法吗?
  • 是的,但是如果没有url,应该不是吗?没有url就没有页面
  • @Sefan,你说得对,我的错,我会调整答案
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多