2011-02-05 13 views
8

miei Rails 3 sito è di essere colpiti dai crawler con strani accettare le intestazioni, le eccezioni di trigger come comeRails 3 e Strano Accetta intestazioni

ActionView::MissingTemplate occurred in home#show 

Ecco alcune delle intestazioni accettare causando problemi

text/* 
application/jxw 
*/*;q=0.1 

In questi casi, questo viene interpretato come il formato della richiesta e, come tale, causa l'errore del modello mancante. Non mi interessa davvero cosa ritorni su questi crawler, ma voglio solo evitare le eccezioni.

+0

Questo sembra essere risolto in Rails 3.1. Discussione qui: https://github.com/rails/rails/issues/701 – tee

risposta

7

Si potrebbe salvare da eccezione come questo nel vostro controller dell'applicazione e rendere il modello HTML invece:

class ApplicationController 
    rescue_from ActionView::MissingTemplate, :with => :render_html 

    def render_html 
    if not request.format == "html" and Rails.env.production? 
     render :format => "html" 
    else 
     raise ActionView::MissingTemplate 
    end 
    end 
end 
+1

Aspetta cosa? 'not request.format ==" html "'? Intendevi 'request.format! =" Html "? –

+0

Esiste un buon modo per effettuare richieste nel mio ambiente locale per simulare il problema in questione? Mi piacerebbe provare questa soluzione, ma voglio essere in grado di assicurarmi che funzioni per noi prima di distribuirla alla produzione. – blim8183

+1

curl -H 'Accetta: image/jpeg' http: // localhost: 3000/youraction – todd

1

Poiché SO impedisce l'aggiunta di commenti finché non ho 50 reputazione, devo inviare una nuova risposta per rispondere alla domanda di Ryan Bigg nei commenti.

not request.format == "html" è più o meno la stessa cosa di request.format != "html". and, or e not sono identicamente identici a &&, || e ! - tuttavia, hanno una precedenza molto più bassa. Quindi, in questo esempio, l'operatore == valuta prima l'operatore not, in modo che produca lo stesso risultato dell'uso di !=.

+1

Certo, ma Ryan molto probabilmente voleva dire che il modo in cui 'not foo == bar' è reso più difficile da analizzare (per un umano) di' foo! = bar'. –