Как получить содержимое локального URL-адреса из метода контроллера в Rails?

Получение исключения тайм-аута при попытке доступа к веб-странице. В методе контроллера или вспомогательном методе, пытающемся получить содержимое локального URL-адреса:

require 'open-uri'
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json'))

В результате получаю ошибку тайм-аута. Если я запущу этот код в irb, он будет работать.

Как я могу правильно получить содержимое локального URL-адреса в рельсах?


person ambi    schedule 27.10.2014    source источник
comment
я немного скептически отношусь к необходимости 0.0.0.0:3000 . Вы проверили журнал и увидели, получает ли файл рельсы?   -  person argentum47    schedule 27.10.2014


Ответы (2)


Я думаю, вам нужно добавить .read после открытия файла:

require 'open-uri'
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json').read)
person Nimir    schedule 27.10.2014
comment
Бесполезно, та же проблема - Timeout::Error - person ambi; 27.10.2014

Интуиция:

Это происходит потому, что запросы обрабатываются последовательно.

Допустим, у вас есть два запроса. Один для просмотра страницы А, а другой для просмотра страницы Б.

Однако запрос на просмотр страницы B не может быть выполнен до тех пор, пока просмотр страницы A не будет выполнен.

В вашем случае вы создали зависимость: страница A не может завершить отрисовку, пока не отобразится страница B. Однако страница B не будет отображаться до тех пор, пока не будут выполнены все предыдущие запросы (в данном случае запрос на отображение страницы A).

Короче говоря, выполнение запроса на чтение зависит от запрошенной загрузки страницы.

Что здесь происходит:

Ваш запрос на визуализацию JSON не может быть завершен до тех пор, пока исходный запрос не будет завершен, поэтому процесс зависает.

В конце концов, он ждет слишком долго и просто истекает.

Это происходит потому, что в отличие от других языков (например, Javascript), запросы Ruby блокируются при выполнении в одном потоке (т.е. синхронном, а не асинхронном).

Решение:

Обратите внимание, что если вы запускаете несколько процессов или потоков, это сработает. См. этот ответ SO..

Однако вместо порождения потоков вы можете просто визуализировать файл непосредственно в строку с помощью метода render_to_string в Rails.

Удачи.

person Yuval Karmi    schedule 05.04.2016