with standard rails pages error ruby-on-rails error-handling routing

ruby-on-rails - standard - ruby on rails routes



¿Páginas de error personalizadas en rieles? (4)

Necesito implementar una página de error personalizada en mi aplicación de rieles que me permita usar erb.

He estado siguiendo este tutorial ( http://blog.tommilewski.net/2009/05/custom-error-pages-in-rails/ ) y no puedo hacer que funcione localmente (o de forma remota). Estoy corriendo Rails 2.3.5

Aquí está la esencia del enfoque.

1) en el ''application_controller'', sobrepaso el método "render_optional_error_file (status_code)", y configuro la visibilidad en "protegido", como este.

protected def render_optional_error_file(status_code) known_codes = ["404", "422", "500"] status = interpret_status(status_code) if known_codes.include?(status_code) render :template => "/errors/#{status[0,3]}.html.erb", :status => status, :layout => ''errors.html.erb'' else render :template => "/errors/unknown.html.erb", :status => status, :layout => ''errors.html.erb'' end end def local_request? true end

También creé una carpeta dentro de las vistas llamadas errors y creé las siguientes vistas: 404.html.erb , 422.html.erb , 500.html.erb , 500.html.erb y creé un nuevo diseño "errors.html.erb "

Parece que no puedo hacerlo funcionar. He estado intentando activar la página 404 navegando a http://localhost:3000/foobar , pero en lugar de obtener el nuevo 404.html.erb , parece que 404.html.erb error estándar de apache 500. Esto sucede cuando trato con mongrel_rails start y mongrel_rails start -e production .


En primer lugar, ha eliminado el archivo: ''public / 500.html'' Si ese archivo existe, anulará cualquier otra cosa que intente hacer.

En segundo lugar, el uso de un explícito "rescue_from" en el controlador (como se explica en el otro comentario) es una buena opción si necesita ajustar la respuesta a diferentes tipos de errores.


Lo más probable es que obtenga el error 500 debido a un error de aplicación. ¿Has revisado los archivos de registro?

Actualizar:

¿Está seguro de que está ejecutando 2.3.5 y no una versión anterior que se instala? Mongrel debería decir qué versión está ejecutando cuando se inicia, de lo contrario debería decir en el archivo config / environment.rb.

Hay algunos errores en el código que podrían crear el error 500. Cambié eso y también corregí algunas otras cosas que creo que querías decir :)

def render_optional_error_file(status_code) known_codes = ["404", "422", "500"] status = interpret_status(status_code) if known_codes.include?(status) # Here it should be status, not status_code (which is a symbol) render :template => "errors/#{status[0,3]}", :status => status, :layout => ''errors'' # No need to mention ".html.erb", you can do it, but it is not necessary since rails will guess the correct format. else render :template => "errors/unknown", :status => status, :layout => ''errors'' end end def local_request? # This must return false instead of true so that the public viewer is called # instead of the developer version. false end


Propósito de la integridad para las nuevas versiones de rieles:

http://www.frick-web.com/en/blog/nifty_errorpages-gem

es un pequeño motor de rieles para manejar tus páginas de error. Tal vez lo necesites para nuevos proyectos. Es una buena opción para manejar errores en mi opinión.


Yo sugeriría usar excepciones para representar tales páginas de error, para que pueda usar la herencia para agrupar sus mensajes de error ...

Primero, declare algunos (normalmente lo hago en application_controller.rb)

class Error404 < StandardError; end class PostNotFound < Error404; end

Luego agregue el código a ApplicationController para manejarlos

class ApplicationController < ActionController::Base # ActionController::RoutingError works in Rails 2.x only. # rescue_from ActionController::RoutingError, :with => :render_404 rescue_from Error404, :with => :render_404 rescue_from PostNotFound, :with => :render_post_not_found def render_404 respond_to do |type| type.html { render :template => "errors/error_404", :status => 404, :layout => ''error'' } type.all { render :nothing => true, :status => 404 } end true end def render_post_not_found respond_to do |type| type.html { render :template => "errors/shop_not_found", :status => 404, :layout => ''error'' } type.all { render :nothing => true, :status => 404 } end true end end

Esto genera errores / error_404 con el diseño de errores. Debería empezar :)

Y en tu target_controller:

raise PostNotFound unless @post

Editar

Nota para rieles 3

para obtener una explicación más detallada de por qué ActionController :: RoutingError no funciona para los rieles 3: Manejo de excepciones de Rails 3.0 .

Billete de riel 4444

"Si su aplicación se basa en motores que extienden su aplicación con sus propias rutas, las cosas se romperán porque esas rutas nunca se dispararán".