Rails:如何创建一个使用资产管道的自定义404错误页面? [英] Rails: How do I create a custom 404 error page that uses the asset pipeline?

查看:48
本文介绍了Rails:如何创建一个使用资产管道的自定义404错误页面?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有许多解决方案可用于创建自定义的错误处理页面,但对于Rails 4几乎没有解决方案:

There are many solutions for creating customized error handling pages, but almost none for Rails 4:

  • Basic Rails 404 Error Page
  • Dynamic error pages in Rails

鼓励人们修改/public中的404.html的标准答案对我不起作用,因为我想使用资产管道中的CSS主题. 有没有办法让html文件访问资产管道中定义的样式?如果没有,有没有办法创建可以访问管道的自定义错误处理程序? >

The standard answer of encouraging people to modify 404.html in /public doesn't work for me because I want to use the CSS theme that resides in the asset pipeline. Is there a way that html files can access those styles defined in the asset pipeline? If not, is there a way to create a custom error handler that has access to the pipeline?

推荐答案

对于Rails 4.1,我喜欢此答案,添加资产类型更好;但是我还没有尝试过.在Rails 4.0.8上,以下三个参考对我有帮助:

For Rails 4.1 I like this answer, add an asset type better; however I have not tried it. On Rails 4.0.8, these three references helped me:

  1. Dynamic error pages is the second reference in the question. This worked just fine for me.

Custom error pages may have cribbed from the first reference, or the other way around, but goes the extra mile by adding some information about testing with Capybara.

我没有执行Capybara测试,因为我不想更改测试配置.但是, RSpec-Rails请求规范提示我独立测试这些请求,看到它们完成并返回正确的内容.

I did not do the Capybara testing because I didn't want to change the test configuration; however, RSpec-Rails Request Specs clued me in to test these requests independently and see that they complete and return the correct content.

以下是对这三个参考文献所讲授的内容的简要描述:

What follows is a nutshell description of what is taught by the three references:

  1. 将以下设置添加到config/environments/production.rb

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

  • 编辑路由配置,config/routes.rb将错误页面定向到错误控制器

  • Edit the routing configuration, config/routes.rb to direct the error pages to an errors controller

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

    使用参数code具有状态码的值,将404、422、500和503页面请求路由到errors控制器的show操作.

    will route the 404, 422, 500, and 503 page requests to the show action of the errors controller with a parameter code that has the value of the status code.

    创建控制器app/controllers/errors_controller.rb.这是全部内容:

    Create the controller, app/controllers/errors_controller.rb. Here is the entire content:

    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
    

    我的偏好是在flash.alert

    自己创建页面.我使用.erb这是app/views/errors/500.html.erb

    Create the pages themselves. I use .erb Here is app/views/errors/500.html.erb

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

    因此您看到可以渲染部分图像.该页面将使用app/views/layouts/application.html.erb中的所有布局样板或您配置的任何其他布局样板进行渲染.其中包括<div id='alert'><%= alert %></div>,它显示闪存中的状态消息.

    So you see that you can render a partial. The page renders with all of the layout boilerplate from app/views/layouts/application.html.erb or any other layout boilerplate that you have configured. That includes the <div id='alert'><%= alert %></div> that displays the status message from the flash.

    通过添加测试文件spec/requests/errors_request_spec.rb,使用RSpec进行了测试.这是该文件的缩写内容,显示了对500状态页的测试:

    Tested with RSpec by adding a test file, spec/requests/errors_request_spec.rb. Here is abbreviated content of that file that shows a test of the 500 status page:

    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
    

    第一个断言检查闪动警报.第二个断言检查部分.

    The first assertion checks for the flash alert. The second assertion checks for the partial.

    这篇关于Rails:如何创建一个使用资产管道的自定义404错误页面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆