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 .
"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".