2015-10-09 6 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 лучший способ сделать один redo? Будет ли begin лучше?

  2. Понимая, что в каждой из этих проверок задана переменная @url, в условной ветви есть избыточность в get(@url). Есть ли более краткий путь?

  3. Я пишу redo три раза который тоже похоже излишний. Есть ли способ вызвать его один раз и все еще установить переменную @url?

Спасибо за помощь!

+0

Не уверен, что я полностью понимаю вопрос, но вы можете объединить дела в 'case' заявление с запятой (например,' когда CONTACT_LINK ?, contact_page? '). Вам также не нужно 'else' перед блоком' if english_link? '. Это может быть учтено в вашем случае stat –

ответ

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

Привет @peter, иногда нет контактной ссылки. Не будет «возвращать нуль, если @ url.nil?» На самом деле выйти из метода? – binarymason

+0

Да, но если нет URL-адреса, это не так ли? нет страницы, если нет url – peter

 Смежные вопросы

  • Нет связанных вопросов^_^