簡體   English   中英

Rails:如何創建使用資產管道的自定義 404 錯誤頁面?

[英]Rails: How do I create a custom 404 error page that uses the asset pipeline?

創建自定義錯誤處理頁面有很多解決方案,但對於 Rails 4 幾乎沒有:

鼓勵人們修改/public中的404.html的標准答案對我不起作用,因為我想使用資產管道中的 CSS 主題。 有沒有辦法讓 html 文件可以訪問資產管道中定義的那些樣式? 如果沒有,有沒有辦法創建一個可以訪問管道的自定義錯誤處理程序?

對於 Rails 4.1 我喜歡這個答案,更好地添加資產類型 但是我還沒有嘗試過。 在 Rails 4.0.8 上,這三個參考資料幫助了我:

  1. 動態錯誤頁面是問題中的第二個參考。 這對我來說很好。

  2. 自定義錯誤頁面可能從第一個參考文獻中抄襲,或者相反,但通過添加一些有關使用 Capybara 進行測試的信息,更進一步。

  3. 我沒有做 Capybara 測試,因為我不想改變測試配置; 然而, RSpec-Rails 請求規范提示我獨立測試這些請求,並查看它們是否完成並返回正確的內容。

以下是對三篇參考文獻所教內容的簡要描述:

  1. 將以下設置添加到config/environments/production.rb

     # Route exceptions to the application router vs. default config.exceptions_app = self.routes
  2. 編輯路由配置config/routes.rb以將錯誤頁面config/routes.rb到錯誤控制器

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

    將路由404,422,500,和503頁請求到show中的動作errors控制器參數code具有狀態碼的值。

  3. 創建控制器app/controllers/errors_controller.rb 以下是全部內容:

     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上設置狀態消息

  4. 自己創建頁面。 我使用.erb這是app/views/errors/500.html.erb

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

    所以你看到你可以渲染部分。 該頁面使用來自app/views/layouts/application.html.erb所有布局樣板或您已配置的任何其他布局樣板呈現。 這包括顯示來自 Flash 的狀態消息的<div id='alert'><%= alert %></div>

  5. 通過添加測試文件spec/requests/errors_request_spec.rb使用 RSpec 進行測試。 以下是該文件的縮寫內容,顯示了 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

    第一個斷言檢查閃光警報。 第二個斷言檢查部分。

我們已經為您制作了一個 gem: exception_handler

還有一個偉大的教程在這里

我也寫了一個廣泛的答案關於這個問題在這里

中間件

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

控制器

# 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

看法

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

這是非常簡單的版本 - 如果您願意,我可以解釋更多。

基本上,您需要掛鈎config.exceptions_app中間件,它將捕獲middleware堆棧中的任何異常(而不是渲染整個環境),允許您將請求發送到您自己的controller#action

如果您發表評論,如果您願意,我會為您提供更多幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM