the rails present not images asset application ruby-on-rails ruby-on-rails-4 error-handling asset-pipeline

ruby on rails - present - Rails 4: ¿Cómo creo una página 404 personalizada que utiliza la canalización de activos?



the asset is not present in the asset pipeline (2)

Hay muchas soluciones para crear páginas personalizadas para el manejo de errores, pero casi ninguna para Rails 4:

La respuesta estándar de animar a las personas a modificar 404.html en /public no me funciona porque quiero usar el tema CSS que reside en la canalización de activos. ¿Hay alguna forma de que los archivos html puedan acceder a los estilos definidos en la canalización de activos? Si no, ¿hay alguna manera de crear un controlador de error personalizado que tenga acceso a la canalización?


Hemos creado una joya que hace esto por usted: exception_handler .

También hay un gran tutorial here .

También escribí una respuesta extensa sobre el tema here .

Middleware

# config/application.rb config.exceptions_app = ->(env) { ExceptionController.action(:show).call(env) }

Controlador

# app/controllers/exception_controller.rb class ExceptionController < ApplicationController respond_to :json, :js, :html before_action :set_status def show respond_with @status end private def set_status def status @exception = env[''action_dispatch.exception''] @status = ActionDispatch::ExceptionWrapper.new(env, @exception).status_code @response = ActionDispatch::ExceptionWrapper.rescue_responses[@exception.class.name] end end end

Ver

# app/views/exception/show.html.erb <h1>404 error</h1>

Esta es una versión muy simple: puedo explicar más si lo desea.

Básicamente, necesitas conectar el middleware config.exceptions_app , capturará cualquier excepción en la pila de middleware (en lugar de renderizar todo el entorno), permitiéndote enviar la solicitud a tu propia controller#action .

Si comentas, ¡te ayudaré un poco más si quieres!


Para Rails 4.1 Me gusta esta respuesta, agregue un tipo de activo mejor; sin embargo, no lo he probado. En Rails 4.0.8, estas tres referencias me ayudaron:

  1. Las páginas de error dinámico es la segunda referencia en la pregunta. Esto funcionó bien para mí.

  2. Las páginas de error personalizadas pueden haber sido copiadas de la primera referencia, o al revés, pero va más allá al agregar cierta información sobre las pruebas con Capibara.

  3. No hice las pruebas de Capibara porque no quería cambiar la configuración de la prueba; sin embargo, RSpec-Rails Request Specs me ayudó a probar estas solicitudes de forma independiente y ver que completen y devuelvan el contenido correcto.

Lo que sigue es una breve descripción de lo que enseñan las tres referencias:

  1. Agregue la siguiente configuración a config/environments/production.rb

    # Route exceptions to the application router vs. default config.exceptions_app = self.routes

  2. Edite la configuración de enrutamiento, config/routes.rb para dirigir las páginas de error a un controlador de errores

    # error pages %w( 404 422 500 503 ).each do |code| get code, :to => "errors#show", :code => code end

    enrutará las solicitudes de página 404, 422, 500 y 503 a la acción show del controlador de errors con un code parámetro que tiene el valor del código de estado.

  3. Crea el controlador, app/controllers/errors_controller.rb . Aquí está todo el contenido:

    class ErrorsController < ApplicationController def show status_code = params[:code] || 500 flash.alert = "Status #{status_code}" render status_code.to_s, status: status_code end end

    Mi preferencia era establecer un mensaje de estado en flash.alert

  4. Crea las páginas ellos mismos. Yo uso .erb Aquí está la app/views/errors/500.html.erb

    <p>Our apology. Your request caused an error.</p> <%= render ''product_description'' %>

    Entonces ves que puedes renderizar un parcial. La página se muestra con toda la plantilla estándar de la app/views/layouts/application.html.erb o cualquier otra plantilla repetitiva que hayas configurado. Eso incluye el <div id=''alert''><%= alert %></div> que muestra el mensaje de estado del flash.

  5. Probado con RSpec agregando un archivo de prueba, spec/requests/errors_request_spec.rb . Aquí está el contenido abreviado de ese archivo que muestra una prueba de la página de estado de 500:

    require ''rails_helper'' RSpec.describe "errors", :type => :request do it "displays the 500 page" do get "/500" assert_select ''div#alert'', ''Status 500'' assert_select ''div[itemtype]'' end end

    La primera afirmación verifica la alerta de flash. La segunda afirmación verifica el parcial.