2011-02-05 11 views
8

Mis Rails 3 sitio está siendo golpeado por los rastreadores con extraña aceptar cabeceras, excepciones gatillo como comocarriles 3 y extraño Aceptar encabezados

ActionView::MissingTemplate occurred in home#show 

Estas son algunas de las cabeceras de aceptación causando problemas

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

En estos casos, esto se interpreta como el formato de la solicitud y, como tal, causa el error de plantilla faltante. Realmente no me importa lo que devuelvo a estos rastreadores, pero solo quiero evitar las excepciones.

+0

Parece que esto se resuelve en Rails 3.1. Discusión aquí: https://github.com/rails/rails/issues/701 – tee

Respuesta

7

Se podía rescatar de excepción como este en el controlador de la aplicación y hacer que la plantilla HTML en su lugar:

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

Espera, ¿qué? 'no request.format ==" html "'? ¿Quiso decir 'request.format! =" Html "? –

+0

¿Existe alguna manera de realizar solicitudes en mi entorno local para simular el problema en cuestión? Me gustaría probar esta solución, pero quiero asegurarme de que funciona para nosotros antes de implementarla en producción. – blim8183

+1

curl -H 'Aceptar: imagen/jpeg' http: // localhost: 3000/youraction – todd

1

Como SO no agrega comentarios hasta que tengo 50 reputación, debo enviar una nueva respuesta para responder a la pregunta de Ryan Bigg en los comentarios.

not request.format == "html" es más o menos lo mismo que request.format != "html". and, or y not son lógicamente idénticos a &&, || y ! - sin embargo, tienen una precedencia mucho menor. Entonces, en este ejemplo, el operador == evalúa antes del operador not, de modo que produce el mismo resultado que usando !=.

+1

Claro, pero lo más probable es que Ryan significara que la forma en que 'not foo == bar' está redactada hace que sea mucho más difícil de analizar (para un humano) que' foo! = bar'. –

Cuestiones relacionadas