2011-04-05 13 views
15

Para uno de mis proyectos que estoy recibiendo esta excepción de vez en cuando:blogs plantilla Missing/índice en Ruby on Rails proyecto

ActionView :: MissingTemplate: Falta plantilla de blogs/índice con manipuladores: {= > [: rxml,: erb,: builder,: rjs,: haml,: rhtml],: formatos => ["image/jpeg", "image/pjpeg", "image/png", "image/gif"] ,: locale => [: en,: es]} en vista de caminos "/ var/www/keeponposting/releases/20110403083651/app/views"

parece que alguien está solicitando una imagen desde una URL que iSN 't una imagen:

HTTP_ACCEPT "image/jpeg, imagen/pjpeg, image/gif, image/gif"

Alguna idea de lo que se puede hacer al respecto? ¿Tengo que implementar un controlador para uno de esos y devolver "" para deshacerme de estas excepciones o hay una mejor manera de manejarlo?

Ahora también estoy poniendo esto:

ActionView :: MissingTemplate: blogs plantilla Missing/índice con formatos: {=> [ "text/*"], manipuladores: => [: rjs, : haml,: rhtml,: erb,: rxml,: builder],: locale => [: en,: en]} en las rutas de vista "/ var/www/keeponposting/releases/20110415040109/app/views"

¿No hay forma de enviar de vuelta HTML sin importar el formato que se solicite?

Respuesta

8

que fija este tema (hace unos minutos - por lo ahora, todo bien) con esta nueva opción de carriles 3.1:

config.action_dispatch.ignore_accept_header = true 

Como se mencionó en this Rails issue. Eso va en config/application.rb.

he comprobado como tal en una prueba de petición RSpec (usando Capybara):

it "should not break with HTTP_ACCEPT image/*;w=320;h=420 from iPhone" do 
    page.driver.header "Accept", "image/*;w=320;h=420" 
    visit "/some/path" 
    page.should have_content("Some content") 
end 
+0

Eso es bueno, pero ¿hay alguna buena navegador por ahí haciendo, o se trata de un ataque o intento de hackear o DOS o bot? –

5

Me sentiría tentado a rescatar la MissingTemplate en el controlador de la aplicación y registrar el encabezado Referrer para ver qué es lo que desencadena esta solicitud. ¡Nunca se sabe, podría ser una parte oscura de tu propia aplicación!

Si, por otro lado, confía en que esto es causado por un robot, ¿ha considerado agregar la URL ofensiva a su archivo robots.txt? Por ejemplo:

User-Agent: YandexImages 
Disallow: /your/failed/path 

Reemplazando 'su/error/ruta' con la ruta en la que el robot se topa. Si el robot está luchando por todo el lugar, sólo podría no permitir el acceso a todo el sitio para ese robot en particular:

User-Agent: YandexImages 
Disallow:/

Creo que este es un limpiador y un enfoque más claro que la implementación de un controlador específicamente para eliminar los errores de una bot aparentemente en mal estado.

+0

pensé en eso, sino en la excepción reportado en hoptoad por lo general obtener la URL de referencia y esta vez no estaba allí, así que supongo que no hay ninguno. El agente de usuario es Mozilla/5.0 (compatible; YandexImages/3.0; + http: //yandex.com/bots), así que supongo que es un pequeño robot perdido. – Pablo

+0

¿Probablemente vale la pena agregar esta información (junto con las rutas reales a las que se accede) a la pregunta? He editado la respuesta para sugerir excluir el robot de las áreas en cuestión usando robots.txt –

+0

Bloquear un pequeño robot perdido podría corregir este pequeño error. ¿Qué se puede hacer con la aplicación Rails para forzar el tipo de respuesta? – TelegramSam

13

Estoy de acuerdo con el bloqueo del robot ofender, pero si realmente quiere forzar el formato de respuesta añadir un before_filter y establecer request.format = :html, así:

before_filter :force_request_format_to_html 

private 

def force_request_format_to_html 
    request.format = :html 
end 
+1

¡Por supuesto, esto solo funciona si su aplicación no acepta otros formatos! No JSON o XML, que son formatos comunes. – ipd

+1

En mi caso, googlebot estaba llegando a una página de resultados de búsqueda, algo que queríamos, pero no se había establecido un formato. Nuestra acción de búsqueda también permite las solicitudes json, por lo que forzar: html no funcionaría. pero una condición simple lo hace: 'if request [: format] .blank? request.format =: html end' –

6

Aquí es una respuesta más estricta; una sugerencia por purp, de la discusión en issue 4127.

class FooController 
    rescue_from ActionView::MissingTemplate, :with => :missing_template 

    def missing_template 
    render :nothing => true, :status => 406 
    end 
end 
0

Hice esto: En mi controlador, puse una antes de filtro:

def acceptable_mime_type 
    unless request.accepts.detect{|a| a == :json || a == :html} || request.accepts.include?(nil) 
    if request.accepts.detect{|a| a.to_s().include?("*/*")} 
     ActionDispatch::Request.ignore_accept_header = true 
    else 
     render text: "Unacceptable", status: 406 
     false 
    end 
    end 
end 

Se comprueba para mis tipos soportados (por ejemplo JSON, HTML) y nula (nil representa HTML predeterminado), a continuación, si no se admiten aquellos tipos MIME, comprueba para "/" en el encabezado. Si lo encuentra, obligo a los rieles a renderizar el tipo de mime predeterminado ignorando el encabezado de aceptar.

Para probar esto en rspec, he tenido que hacer esto:

describe 'bad header' do 
    describe 'accept' do 
    let(:mimeTypes) { ["application/text, application/octet-stream"] } 

    it 'should return a 406 status code' do 
     request.accept = mimeTypes 
     get 'index' 
     expect(response.response_code).to eq 406 
    end 

    describe 'with */* included' do 
     it 'should return a 200 status code' do 
     request.accept = ["*/*"] + mimeTypes 
     get 'index' 
     expect(response.response_code).to eq 200 
     end 
    end 
    end 
end 

Por alguna razón, me estaba poniendo problemas al tratar de enviar aceptar las cabeceras adecuadamente en rspec utilizando los métodos descritos here, pero me di si establezco request.accept en una matriz, ambas pruebas pasaron. Extraño, lo sé, pero por ahora estoy pasando al siguiente tema.

0

Añadir formats: [:html] a render:

def action 
    render formats: [:html] 
end