У меня ошибка имени и я не совсем уверен, где определить мой аргумент - PullRequest
0 голосов
/ 04 мая 2020

Я делаю CLI-проект для гитары. У меня есть имя и URL-адрес различных гитар, например, так:

def self.get_electric
        doc = Nokogiri::HTML(open("https://reverb.com/c/electric-guitars"))

        electrics = []
        counter = 0

        while counter < doc.css("h2:contains('Popular Electric Guitars')+div.overflowing-row__items ul.tiles.tiles--single-row.tiles--grow.tiles--three-wide li.tiles__tile").length
        electric = {
            name: doc.css("h2:contains('Popular Electric Guitars')+div.overflowing-row__items ul.tiles.tiles--single-row.tiles--grow.tiles--three-wide li.tiles__tile")[counter].text,
            url: doc.css("h2:contains('Popular Electric Guitars')+div.overflowing-row__items ul.tiles.tiles--single-row.tiles--grow.tiles--three-wide li.tiles__tile a.marketing-callout__inner")[counter]["href"]
        }
        counter += 1
        electrics << electric
        end
        electrics
        HiStrung::Guitar.mass_create_electrics(electrics)
    end

Если пользователь наберет 'electri c' или 'acousti c', он получит название гитары и URL:

Enter here: electric

1. Fender Telecaster - https://reverb.com/marketplace/electric-guitars?query=telecaster
2. Gibson Les Paul - https://reverb.com/marketplace?query=les%20paul
3. Fender Stratocaster - https://reverb.com/marketplace/electric-guitars?query=stratocaster
4. Gibson SG - https://reverb.com/marketplace?query=sg
5. Fender Jazzmaster - https://reverb.com/marketplace?query=jazzmaster

Теперь, что я хочу, чтобы моя программа сделала, когда пользователь наберет номер той гитары, о которой он хочет узнать больше, она покажет цену и описание этой гитары. Цена и описание в другом URL.

Я пытаюсь сделать метод, который захватывает URL и получает html для цены и описания:

def self.get_electric_info(electric)
        url = electric.url
        doc = Nokogiri::HTML(url)
    end

, но я получаю это имя ошибка:

pry(main)> HiStrung::Scraper.get_electric_info(electric)
NameError: undefined local variable or method `electric' for main:Object
from (pry):1:in `__pry__'

Вот мой класс инициализации:

class HiStrung::Guitar
attr_accessor :name, :url

@@electrics = []
@@acoustics = []

def self.electrics
    @@electrics
end

def self.acoustics
    @@acoustics
end

def self.mass_create_electrics(electric_hash)
    electric_hash.each do |e_hash|
        electric = HiStrung::Guitar.new(e_hash[:name], e_hash[:url])
        @@electrics << electric
    end
end

def self.mass_create_acoustics(acoustic_hash)
    acoustic_hash.each do |a_hash|
        acoustic = HiStrung::Guitar.new(a_hash[:name], a_hash[:url])
        @@acoustics << acoustic
    end
end

def initialize(name, url)
    @name, @url = name, url
end

end

1 Ответ

0 голосов
/ 04 мая 2020

Вы не предоставляете контекст в точке, где вы вызываете этот метод, но если вы посмотрите в свой код, то увидите, что у вас не определена переменная electric.

Назначьте electric объекту Guitar, для которого вы хотите получить информацию, прежде чем вызывать свой метод.

Сделайте что-то вроде этого:

electric = HiStrung::Guitar.new("My name", "My url")
HiStrung::Scraper.get_electric_info(electric)

Это должно решить проблему.

...