2011-08-26 8 views
7

Sto usando Ruby on Rails v3.0.9 e vorrei verifica se un'immagine (nel mio caso un'immagine di favicon.ico icona) viene recuperato con successo da un sito web e se non mi piacerebbe visualizzare un'immagine personalizzata.Come verificare se un'immagine è stata trovata su un sito web?

Al fine di recuperare l'immagine favicon.ico relativa a un sito web, nel mio file vista ho:

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

dove web_site.link valori sono qualcosa come i seguenti:

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

Come controlla se un'immagine è stata trovata su un sito web (magari usando una dichiarazione if ... else ... end o eseguendo qualche richiesta HTTP prima per gestire le immagini favicon) e come gestire lo scenario sopra?

risposta

6

Ecco come implementare l'idea che avevi nella domanda originale.

Il problema con questo approccio sarà che i tempi di risposta includeranno il tempo necessario perché l'altro dominio risponda alla richiesta per l'immagine. Se il sito sta avendo problemi , la tua pagina non verrà caricata finché la richiesta non scade.

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

L'approccio di jQuery è un po 'più impegnativo. Io suggerirei qualcosa lungo la seguente:

  • creare un tag <img> un'immagine spaziatore trasparente
  • in javascript della pagina con l'esecuzione di una chiamata $.ajax per l'immagine remota
    • nel callback successo sostituire il <img> 'src s con l'URL del immagini remote
    • nella richiamata fallimento sostituire il <img>' src s con l'URL dell'immagine del fallback

Purtroppo, non ho il tempo di generare il codice esatto per questo adesso.

+0

"Purtroppo, non ho il tempo di generare il codice esatto per questo adesso." : '- (... Proverò da solo ... – Backo

+0

Perché usi 'to_f' qui? È possibile che lo status code sia un float piuttosto che int? – new2cpp

+0

@ new2cpp non ho idea del perché ho usato' to_f', editing risposta –

-1

Non è possibile farlo con Rails a meno che non si recuperi il lato server dell'immagine prima di eseguire il rendering della pagina. Quello che potresti fare è recuperarlo nel client con un JavaScript e se c'è difficoltà a recuperarlo, passa a un'alternativa.

+0

Come posso recuperare l'immagine lato server prima di eseguire il rendering della pagina con JavaScript (sto usando jQuery 1.6)? – Backo

+0

Hai opzioni in entrambi gli aspetti, ma la gemma [curb] (http://curb.rubyforge.org/) potrebbe essere l'opzione migliore. Inoltre è scaricabile lato server * o * lato client con JavaScript, non entrambi. È solo che qualcuno deve verificare che il collegamento funzioni, basta scegliere chi. Se stai facendo questo lato server, probabilmente vorrai eseguirlo come processo in background che popola una tabella di mappatura. – tadman

+0

Perché mi consigli di usare la gemma 'cordolo' e non la libreria standard Ruby? – Backo

Problemi correlati