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:
Las páginas de error dinámico es la segunda referencia en la pregunta. Esto funcionó bien para mí.
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.
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:
Agregue la siguiente configuración a
config/environments/production.rb
# Route exceptions to the application router vs. default config.exceptions_app = self.routes
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 deerrors
con uncode
parámetro que tiene el valor del código de estado.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
Crea las páginas ellos mismos. Yo uso
.erb
Aquí está laapp/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.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.