Здесь много чего происходит, но для того, чтобы сделать его более рубиновым, вам стоит подумать о том, чтобы lazy-initialized и дать им имена, отражающие это:
class Wheyscrapper
URL = "https://www.bodyenfitshop.nl/afslanken/afslank-toppers/?%s"
def initialize(company:)
@company = company
# Use encode_www_form to encode query-string parameters
@url = URL % URI.encode_www_form(manufacturer: company)
end
def document
# Lazy-initialize a parsd version of the page
@document ||= Nokogiri::HTML(open(url).read)
end
def products
document.css('div.product-primary').map do |product_name|
{
name: product_name.css('h2.product-name').text
}
end
end
def prices
document.css('div.price-box').map do |product_price|
{
amount: product_price.css('span.price').text
}
end
end
end
Это исправляетмного проблем с распространением данных, которые у вас были в оригинале.Когда вы объявляете переменную, это локальная переменная, то есть она не существует вне определенного вызова этого конкретного метода.Если вы хотите сохранить его дольше, вам нужно использовать переменные экземпляра , как в @products
, или вам нужно определить методы, которые возвращают нужные вам данные.
Приведенный выше подход объединяетчто, используя переменную экземпляра с отложенной инициализацией для сохранения проанализированного документа, и предоставляет этот метод в качестве метода, который могут использовать другие методы.
Теперь вы можете ускорить это:
scraper = WheyScraper.new(company: "Body & Fit")
Гдеэто должно сделать все доступным напрямую:
scraper.prices
scraper.products
Когда вы научитесь эффективно использовать Ruby, вы часто найдете решения ваших проблем, которые действительно минимальны.Обычно большое количество кода Ruby является признаком того, что он не используется должным образом.