2011-05-10 10 views
15

Tengo una acción que sirve mi página de inicio. Funciona bien cuando es visitada normalmente (es decir, por un usuario en un navegador web), pero cuando es visitada por los rastreadores web específicos, que arroja el siguiente error:ActionView :: Error de MissingTemplate, ¿solo cuando lo visita un Bot?

A ActionView::MissingTemplate occurred in tags#promoted: 

Missing template tags/promoted with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>["text/*"], :locale=>[:en, :en]} in view paths "/Apps/accounts/app/views", "/usr/local/rvm/gems/[email protected]/gems/devise-1.3.0/app/views" 
actionpack (3.0.4) lib/action_view/paths.rb:15:in `find' 

Parece que los robots están tratando de buscar el formato de text/*, la cual no hay plantilla para, lo cual tiene sentido, por lo que trató de hacer lo siguiente en mi acción:

def promoted 
    request.format = :html #force html to avoid causing missing template errors 
    # more action stuff.... 
    end 

en esencia, estoy tratando de forzar el formato de la solicitud a html por lo que sirve la plantilla hTML.

Sin embargo, cada vez que estos bots solicitan esta página, se produce el error de plantilla faltante.

No es gran cosa, pero idealmente me gustaría resolver este error, solo para que deje de recibir estos correos de error de mi aplicación.

¿Es la única manera de hacer un archivo llamado my_action.text.erb y poner un poco de galimatías en él? ¿O puedo resolver esto más elegantemente?

+0

¿Se puede publicar su código de controlador y específicamente la acción 'index'? Esto debería ser fácil de desentrañar en un minuto, para resolver el piloto automático de la publicación en formato de Rail. – nessur

Respuesta

7

He estado viendo esto también. Se podría utilizar un poco de middleware para volver a escribir estas solicitudes:

class Bot 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    h = env["HTTP_ACCEPT"] 
    env["HTTP_ACCEPT"] = "text/html" if h == "text/*" 
    @app.call(env) 
    end 
end 

I bifurcada una joya para matar a algunas peticiones de descubrimiento de MS Office, y parecía tener sentido para añadir este middleware en ella.

https://github.com/jwigal/rack-options-request

+0

Definitivamente tiene sentido resolver esto como middleware Rack. –

0

Resulta que este conjunto específico de bots son tan tontos como una roca, e ignoran cualquier tipo de formato de solicitud como yo estaba tratando de hacer. Terminé desautorizando a los Agentes de usuario de estos bots en mi robots.txt. No más errores Sin embargo, si alguien tiene una solución más elegante, publíquela y la marcaré como la respuesta aceptada; de lo contrario, la aceptaré en un par de días.

+0

¿Alguna vez encontró una solución decente, LinkedInBot está lanzando estas excepciones aquí? – Vinozio

Cuestiones relacionadas