Рубин Условный аргумент метода

У меня есть несколько "общих" методов, которые извлекают данные на основе селекторов CSS, которые обычно одинаковы на многих веб-сайтах. Однако у меня есть другой метод, который принимает в качестве аргумента селектор CSS для данного сайта.

Мне нужно вызвать метод get_title, если аргумент title_selector не передан. Как я могу это сделать?

Соскрести, которые принимают селекторы CSS в качестве аргументов

  def scrape(urls, item_selector, title_selector, price_selector,     image_selector)
    collection = []
    urls.each do |url|
      doc = Nokogiri::HTML(open(url).read) # Opens URL
      @items = doc.css(item_selector)[0..1].map {|item| item['href']} # Sets items
      @items.each do  |item| # Donwload each link and parse
        page = Nokogiri::HTML(open(item).read)
        collection << {
          :title   => page.css(title_selector).text, # I guess I need conditional here 
          :price  => page.css(price_selector).text
        }
      end
      @collection = collection
    end
  end

Универсальный экстрактор названий

  def get_title(doc)
    if doc.at_css("meta[property='og:title']")
      title = doc.css("meta[property='og:title']")
    else doc.css('title')
      title = doc.at_css('title').text
    end
  end

1 ответ

Решение

Используйте or оператор внутри вашего page.css вызов. Будет звонить get_title если title_selector фальси (ноль).

:title => page.css(title_selector || get_title(doc)).text,

Я не уверен что doc должно быть на самом деле в этом контексте, хотя.

РЕДАКТИРОВАТЬ

Учитывая ваш комментарий ниже, я думаю, что вы можете просто рефакторинг get_title обрабатывать всю логику. Разрешать get_title принять необязательный title_selector параметр и добавьте эту строку в начало вашего метода:

return doc.css(title_selector).text if title_selector

Тогда моя оригинальная строка становится:

:title => get_title(page, title_selector)
Другие вопросы по тегам