2009-07-16 7 views
20

Tengo un requerimiento para especificar una ruta con nombre en un proyecto de Ruby on Rails que devuelve la página pública/404.html junto con el código de respuesta del servidor 404.Manera más simple de definir una ruta que devuelve un 404

Dejarlo en blanco no es una opción, no preguntes por qué, simplemente es :) Debe ser una ruta con nombre, o una entrada de map.connect.

Algo como esto sería grande:

map.my_named_route '/some/route/', :response => '404'

Alguien tiene alguna idea de lo que es la forma más sencilla de hacer algo como esto. Podría crear un método de controlador que represente el archivo 404.html, pero pensé que podría haber una forma más limpia de hacerlo. Mirando hacia adelante a cualquier respuesta - gracias,

Eliot

Respuesta

39

podrá ir a un punto extremo de bastidor (carriles 3) que VENDS un simple 404:

match 'my/route', to: proc { [404, {}, ['']] } 

Esto es particularmente útil, por ejemplo, para definir una ruta llamada a su omniauth endpoint:

match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize 
+0

Este es un buen enfoque para cualquier respuesta que no necesite un controlador. Todavía es menos eficiente que hacer esto en Apache/nginx. – mmell

+7

En Rails 4 use la opción: a, p. 'get '/ apple-touch * str', a: proc {[404, {}, ['']]} – mmell

+1

@mmell Eso no funcionará, tienes que hacer esto:' get '/: str' , a: proc {[404, {}, ['']]}, restricciones: {str:/apple-touch. * /} ' – Amala

2

¿Por qué no hacer esto en Apache/nginx en el que utiliza mod_rewrite (o como nginx hace reescrituras) para enlazar con una página que no existe o en su lugar enviar un 410 (Ido, ya no existe) ¿Bandera?

De todos modos, si desea que los carriles de aplicación para hacer esto, creo que la forma es como usted sugiere, crear una ruta llamada a una acción que hace un render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)

3

En su routes.rb:

map.my_404 '/ohnoes', :controller => 'foobar', :action => 'ohnoes' 

En FoobarController:

def ohnoes 
    render :text => "Not found", :status => 404 
end 

Si usted necesita para hacer que el mismo archivo 404 como una normal de 404, se puede hacer eso con render :file.

Consulte la documentación de ActionController::Base para ver ejemplos.

1

Versión un poco más corta que las respuestas anteriores a 404 cualquier obtener en una línea. get '*_', to: ->(_) { [404, {}, ['']] }

Cuestiones relacionadas