Неопределенный метод 'путь' для StringIO в Ruby - PullRequest
3 голосов
/ 04 июня 2011

Я использую следующий фрагмент кода в приложении Rails:

require 'open-uri'
url = "http://..."
uri = URI.parse(self.url)
file = open(uri)
puts "path: #{file.path}"

, который работает с некоторыми файлами в Интернете, а затем с другими:

undefined метод`путь 'для #

Есть ли способ исправить эту странную, неустойчивую проблему?

Ответы [ 3 ]

8 голосов
/ 15 мая 2014

Я определенно опаздываю на вечеринку, но ...

Корень этой проблемы в том, что если вы используете open(url) для файла размером менее 10 КБ, он автоматически преобразует его в строковый объект ввода-вывода вместо использования Tempfile. У объекта StringIO, как все указали, нет метода path, определенного для него.

Значение по умолчанию (10 КБ) устанавливается постоянной StringMax ...

http://yard.ruby -doc.org / STDLIB-2.1.0 / OpenURI / Buffer.html

if defined?(OpenURI) && OpenURI::Buffer.const_defined?(StringMax)
  OpenURI::Buffer.send('remove_const', StringMax)
  OpenURI::Buffer.send('const_set', StringMax, 0)
end

Проблема штанги решена!

p.s. убедитесь, что вы используете #send, иначе вы не сможете получить доступ к методам #remove_const и #cont_set. p.p.s. Я бы не советовал устанавливать его в ноль, если вы выполняете много небольших операций ввода-вывода, поскольку созданные временные файлы, вероятно, будут хуже, чем просто изменение кода для правильного использования StringIO. Все зависит от вашего варианта использования.

7 голосов
/ 04 июня 2011

Не используйте Open :: URI таким образом.

Просто выполните:

file = open(url)

Тогда вы можете read файл, потому что у вас есть объект типа IO:

body = file.read

или

body = open(url).read

Если вам нужен путь, проанализируйте URL с URI и получите путь таким образом.

2 голосов
/ 04 июня 2011

В соответствии с документами SrtingIO имеет путь к имени функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...