read_timeout в Нокогири?

Я получаю некоторые данные о погоде из онлайн-документа xml, используя Nokogiri, и я хотел бы установить тайм-аут для корректного восстановления на случай, если источник недоступен...

Мои поиски в Google показывают несколько возможных методов для open-uri и Net::HTTP, но ни один из них не относится к Nokogiri. Мои попытки использовать эти методы терпят неудачу (что неудивительно):

begin
currentloc = ("http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=" + @destination.weatherloc)
currentloc.read_timeout = 10 # 
doc = Nokogiri::XML(open(currentloc))
rescue Timeout::Error
  return "Current weather for this location not available: request timed out."
end

возвращает "NoMethodError", и:

begin
currentloc = ("http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=" + @destination.weatherloc)
doc = Nokogiri::XML(open(currentloc), :read_timeout => 10)
rescue Timeout::Error
  return "Current weather for this location not available: request timed out."
end

возвращает "TypeError не может преобразовать Hash в String"

Поддерживает ли Nokogiri такой метод (и если да, то как?), или мне следует искать какое-то другое решение?

Спасибо.


person Community    schedule 25.09.2009    source источник


Ответы (1)


Вы можете использовать модуль тайм-аута:

require 'open-uri'
require 'nokogiri'
require 'timeout'

begin
  timeout(10) do
    result = Nokogiri::XML(open(currentloc))
  end
rescue Timeout::Error
  return "Current weahter..."
end
person Vincent    schedule 25.09.2009
comment
Кажется, это работает (по крайней мере, оно не ломается), но когда я пытаюсь проверить это, отключив eth0, я получаю ошибку SocketError. Думаю, для этого мне тоже нужен какой-то условный тест. Однако добавление дополнительного оператора спасения (rescue SocketError) не выполняется. Спасибо - person ; 26.09.2009
comment
Можете ли вы опубликовать свой код, чтобы я мог увидеть для себя более подробно? - person Vincent; 27.09.2009