2009-06-03 16 views

Respuesta

6

Verificar Henrik Nyh's post salir. Otros también se pueden encontrar a través de google.

La idea detrás de: Rails parece representar public/404.html por errores 404.

  • A continuación, podría sobrescribir la página si desea mostrar un campo estático
  • de un contenido dinámico, parece que se puede reemplazar un método marco para enganchar y redirigir a hacer que su página dinámica.

ActionController::Rescue define un rescue_action_in_public que llama render_optional_error_file.

+8

No rails 3 amistoso – AnApprentice

+1

@AnApp podría ser ... es una respuesta antigua: podría publicar la versión de Rails 3 como una respuesta separada. – Gishu

+4

¿Cuál es la versión de Rails 3? –

9

sólo tiene que añadir lo siguiente a su ApplicationController:

rescue_from ActiveRecord::RecordNotFound, :with => :render_record_not_found 

    # Catch record not found for Active Record 
    def render_record_not_found 
    render :template => "shared/catchmissingpage", :layout => false, :status => 404 
    end 

    # Catches any missing methods and calls the general render_missing_page method 
    def method_missing(*args) 
    render_missing_page # calls my common 404 rendering method 
    end 

    # General method to render a 404 
    def render_missing_page 
    render :template => "shared/catchmissingpage", :layout => false, :status => 404 
    end 

Es posible personalizar la llamada render (utilizar sus plantillas, utilizar un diseño etc.) y detectar errores de esta manera. Ahora detecta el método faltante y record_not_found, pero tal vez haya casos en los que desee mostrar una página de 500 Error para que pueda seguir adelante, utilice este enfoque y haga que se ajuste a sus necesidades.

Para probar desde una máquina local, simplemente funciona así. si sólo se quiere que funcione en el modo de producción, añadir un

if ENV['RAILS_ENV'] == 'production' 

y que estás bien.

+0

On Rails 3.1 esto no funciona para mí en general 404 páginas, solo para registros no encontrados. En cambio, sigue tirando de public/404.html y, si ese archivo falta, simplemente genera una página vacía. –

3

Si decide crear un 404 (u otro código de estado) página dinámica asegúrese de quitar el archivo html correspondiente de /public (si existe)

13

Miré a unos entradas de blog en Google sobre cómo para hacer esto, lamentablemente la mayoría parece depender de la contaminación de su ApplicationController.

Lo que hice en cambio era crear una plantilla con el mensaje 404 y luego usar esa plantilla para actualizar el archivo público/404.html de una tarea rake:

# Rake file to generate static 404 page 

file "public/404.html" => ["app/views/layouts/application.html.erb"] do |t| 
    print "Updating 404 page\n" 
    `curl --silent http://locahost/content/error404 -o public/404.html` 
end 

Ahora cada vez que se actualiza el diseño global de la La página 404 se actualiza automáticamente.

1

En el frente de prueba, una buena forma de hacerlo (con fines de desarrollo, al menos) es usar Passenger y establecer el entorno de raíles en producción (o comentar "RailsEnv development" en la configuración del sitio). Al menos de esta manera puedes imitar cómo funciona en producción.

Pero, para hacer esto, tengo una variedad de archivos de configuración que se analizan al iniciar y se recogen según el entorno. Una de las configuraciones es si mostrar páginas de error (AppSettings.show_page_errors?).Luego, en mi Controlador de aplicación, tengo

if !AppSettings.show_page_errors? 
    alias_method :rescue_action_locally, :rescue_action_in_public 
    end 

Por lo tanto, en general se establece en la configuración predeterminada, pero a veces realmente tengo que ver lo que está pasando exactamente, por lo que puedo apagarlo en la producción.

El otro paso es usar páginas personalizadas. En mi caso, tengo plantillas basadas en el error que también incluyen un formulario para enviar a los formularios de Google (ya que mi servidor puede estar roto). Para hacer eso, poner esto (y cambiar según sea necesario) en su Controlador de aplicación:

def render_optional_error_file(status_code) 
    status = interpret_status(status_code) 
    render :template => "/errors/#{status.to_s[0,3]}.html.haml", :status => status, :layout => 'application.html.haml' if [404, 422, 500].include?(status) 
    render :template => "/errors/unknown.html.haml", :status => status, :layout => 'application.html.haml' unless [404, 422, 500].include?(status) 
end 

Esto hará que los códigos de estado 404, 422 y 500 con la plantilla, pero por lo demás utiliza desconocido. Si necesita manejar otros, es solo cuestión de actualizar este método y agregar la plantilla.

Cuestiones relacionadas