Я использую Ruby on Rails v3.0.9 и хотел бы проверить, успешно ли получено изображение (в моем случае изображение значка favicon.ico) с веб-сайта и если не Я хотел бы отображать собственное изображение .

Чтобы получить изображение favicon.ico, относящееся к веб-сайту, в моем файле просмотра у меня есть:

image_tag "#{web_site.link}/favicon.ico", :size => "16x16"

Где значения web_site.link выглядят примерно так:

http://stackoverflow.com/
http://www.stackoverflow.com/
http://facebook.com/
...

Как проверить, было ли изображение найдено на веб-сайте (возможно, с помощью оператора if ... else ... end или выполнения некоторого HTTP-запроса перед обработкой изображений значков) и как справиться с описанным выше сценарием ?

7
Backo 26 Авг 2011 в 18:11

2 ответа

Лучший ответ

Вот как реализовать идею, которую вы придумали в исходном вопросе.

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

<%
img_url = 'http://adomain.com/image.jpg'
res = Net::HTTP.get_response(URI.parse(img_url))
img_url = '[my alternate url]' unless res.code.to_i >= 200 && res.code.to_i < 400 #good codes will be betweem 200 - 399
%>

<%=image_tag img_url%>

Подход jQuery немного сложнее. Я бы предложил следующее:

  • создать тег <img> с прозрачным разделителем
  • в javascript страницы запустите вызов $.ajax для удаленного изображения
    • в обратном вызове успеха замените src <img> на URL-адрес удаленного изображения
    • в обратном вызове ошибки замените src <img> на URL-адрес резервного изображения

К сожалению, сейчас у меня нет времени сгенерировать для этого точный код.

8
Brian Glick 7 Янв 2017 в 18:26

Вы не можете сделать это с Rails, если не получите изображение на стороне сервера перед рендерингом страницы. Что вы можете сделать, так это загрузить его в клиенте с помощью JavaScript, а если возникнут проблемы с его получением, переключитесь на альтернативу.

-1
tadman 26 Авг 2011 в 14:17