2015-10-09 41 views
1

任務是檢查聯繫人頁面是否存在並導航到它。對於非英文網站,該方法將查找英文頁面,然後重新啓動以檢查聯繫頁面。什麼是適當的紅寶石方式重做條件?

我的條件的作品很好,但我想有必須是一個更好的方式來做到這一點:

# 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') 

    [email protected]? 
    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做單個的最好方法redobegin會更好嗎?

  2. 瞭解到我在這些檢查的每一項中設置了@url變量,在條件分支中似乎有get(@url)中的冗餘。有更簡潔的方法嗎?

  3. 我寫了redo三次,這似乎也是多餘的。有沒有辦法調用一次,仍然設置@url變量?

感謝您的幫助!

+0

不知道我完全理解這個問題,但你可以在'case'聲明用逗號結合的情況下(如:'當CONTACT_LINK?contact_page?' )。在if'english_link?'塊之前,您也不需要'else'。這可以在您的案例陳述中加以考慮 –

回答

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 
+0

首先評估左側,即「a ||」。 b'評估'a'首先 – Stefan

+0

Hi @ peter,有時候不存在聯繫鏈接。如果@ url.nil?'實際上退出了方法,不會返回nil嗎? – binarymason

+0

是的,但如果沒有網址,應該不是嗎?沒有網頁,如果沒有網址 – peter