Мне не удается заставить работать метод поиска, который я написал в своем скрипте. Вот соответствующий код из скрипта:
$records = []
def xml_extractor(document)
document.xpath("//record").each do |record|
$records << {"id" => record.xpath('id').text,
"first_name" => record.xpath('first_name').text,
"last_name" => record.xpath('last_name').text,
"email" => record.xpath('email').text,
"gender" => record.xpath('gender').text,
"ip_address" => record.xpath('ip_address').text,
"send_date" => record.xpath('send_date').text,
"email_body" => record.xpath('email_body').text,
"email_title" => record.xpath('email_title').text}
puts record
end
puts "\nAll records loaded!"
end
def search_by_ip(ip)
record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
puts JSON.pretty_generate(record_to_return)
end
В основном мой метод xml_extractor работает нормально и сохраняет все в массиве с помощью nokogiri. XML-файл, который реализуется, имеет тысячу записей, каждая из которых имеет собственное имя_файла, имя_последнего и т. д. Но проблема в том, что когда я пытаюсь реализовать метод search_by_ip в массиве, возвращается значение "null", тогда как метод должен быть на самом деле do возвращает всю запись, принадлежащую этому конкретному IP-адресу. Кроме того, я понял, что каждый раз, когда я реализую метод xml_extractor, то есть когда XML-документ анализируется в массиве, содержимое на самом деле не сохраняется, а отображается только на время выполнения цикла. Возможно, поэтому я получаю «ноль» для моих методов поиска. Дайте мне знать, что вы думаете, ребята.
Извините, но не могли бы вы подробнее рассказать о своих пунктах в коде, потому что я новичок в Ruby, я понимаю ваши пункты, я просто действительно не знаю, как их реализовать. Благодарю.



В ruby ваш метод вернет последнюю строку. Если вы хотите, чтобы ваш метод возвращал данные, вам нужно вернуть их в последней строке. puts ничего не возвращает.
Попробуйте изменить вот так:
def search_by_ip(ip)
record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
puts JSON.pretty_generate(record_to_return)
record_to_return
end
Я написал пример того, как использовать объектно-ориентированный объект для получения желаемого. У меня нет вашего документа, поэтому я упростил его до двухмерного массива В методе read переключите комментарий для работы с вашим xml Каждый метод можно связать в цепочку, и он делает только то, что требуется Все они могут быть протестированы отдельно (здесь, поставив их)
class Xml_extractor
attr_reader :document, :records
def initialize document
@document = document
@records = []
end
def read
# @document.xpath("//record").each do |record|
@document.each do |record|
@records << {id: record[0], ip_address: record[1]}
end
self # return self so that you can chain another method
end
def search_by_ip(ip)
#return first of an array if found, nil otherwise
# attention to use a hash key here to search, not a string
@records.select {|k| k[:ip_address] == ip.to_s}.first
end
end
document = [[0, "192.168.0.1"], [1, "192.168.0.2"]]
p Xml_extractor.new(document).read.records
# [{:id=>0, :ip_address=>"192.168.0.1"}, {:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2")
# [{:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2").to_json
# "[{\"id\":1,\"ip_address\":\"192.168.0.2\"}]"
теперь я понимаю, что вы имеете в виду, большое спасибо за то, что разъяснили мне это и помогли мне с этим, теперь код работает отлично.
пожалуйста, не могли бы вы принять ответ и проголосовать за?
извините, я новичок на сайте, поэтому не знал, как это сделать, но я дал вам много, еще раз спасибо
Я не вижу изменений, вам нужно нажать на галочку слева от моего ответа, иначе ответ останется без ответа. Голосование осуществляется путем нажатия стрелки вверх над цифрой 0.
пусть ваш xml_extractor возвращает записи, нет необходимости в общедоступной переменной, проверьте содержимое того, что возвращается, передайте этот массив в качестве второго параметра search_by_ip. Еще лучше сделать записи класса коллекции с его методами, такими как search_by_ip