2011-08-26 11 views
7

Używam Ruby on Rails v3.0.9 i chciałbym, aby sprawdzić, czy obraz (w moim przypadku favicon.ico obraz ikony) został pomyślnie pobrany z witryny internetowej, a jeśli nie, chciałbym wyświetlić niestandardowy obraz.Jak sprawdzić, czy obraz został znaleziony na stronie internetowej?

W celu odzyskania favicon.ico obraz związany z witryny internetowej, w moim pliku widoku mam:

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

gdzie web_site.link wartości to coś jak następujących:

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

Jak sprawdź, czy obraz został znaleziony na stronie internetowej (może za pomocą instrukcji if ... else ... end lub wykonując pewne żądanie HTTP przed obsługą obrazów favicon) i jak sobie z tym poradzić powyższy scenariusz?

Odpowiedz

6

Oto jak zrealizować ideę, którą posiadałeś w pierwotnym pytaniu.

Problem z tym podejściem będzie polegał na tym, że czas reakcji będzie jednak długi, dopóki druga domena nie odpowie na Twoją prośbę o zdjęcie. Jeśli ta witryna ma problemy z numerami , twoja strona nie zostanie załadowana do czasu upłynięcia limitu czasu.

<% 
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%> 

Podejście jQuery jest nieco bardziej zaangażowane. Sugerowałbym coś wzdłuż następujące:

  • utworzyć tag <img> z przezroczystym spacer image
  • w javascript strony za uruchomienie $.ajax wezwanie do zdalnego obrazu
    • w zwrotnego sukcesu zastąpić <img> „src s dla obrazów zdalnych Adres URL
    • w zwrotnego awarii wymienić <img>” src sz adres URL obrazu zastępczego za

Niestety, nie mam czasu, aby wygenerować dokładny kod w tej chwili.

+0

"Niestety, nie mam czasu, aby wygenerować dokładny kod w tej chwili." : '- (... Spróbuję sam ... – Backo

+0

Dlaczego używasz 'to_f' tutaj? Czy to możliwe, że kod statusu jest float zamiast int? – new2cpp

+0

@ new2cpp nie mam pojęcia, dlaczego użyłem' to_f', edycja odpowiedź –

-1

Nie można tego zrobić z Railsami, chyba że pobieramy serwer po stronie obrazu przed renderowaniem strony. Możesz go pobrać w kliencie za pomocą JavaScript, a jeśli wystąpią problemy z jego pobraniem, przełącz się na alternatywę.

+0

Jak mogę pobrać stronę serwera obrazu przed renderowaniem strony za pomocą JavaScript (używam jQuery 1.6)? – Backo

+0

Masz opcje w obu kategoriach, ale klejnot [krawężnik] (http://curb.rubyforge.org/) może być najlepszą opcją. Również jest to serwer po stronie pobierania * lub * po stronie klienta z JavaScriptem, a nie oba. Po prostu ktoś musi zweryfikować, czy link działa, po prostu musisz wybrać kto. Jeśli robisz to po stronie serwera, prawdopodobnie chcesz uruchomić go jako proces w tle, który zapełnia tabelę odwzorowań. – tadman

+0

Dlaczego radzisz mi korzystać z "krawężnika", a nie z biblioteki standardowej? – Backo

Powiązane problemy