自定义错误页面 - Ruby on Rails

10

我正在尝试在我的网站中设置自定义错误页面。我遵循PerfectLine博客中的指导方针。

当控制器存在但id不存在时,它可以正常工作。例如,我有一个博客控制器,但id为4不存在。它会显示自定义错误页面。

但如果控制器本身不存在,则无法使用该方法进行捕获。例如,如果我键入一些随机控制器和数字id,则无法通过我在应用程序控制器中设置的方法重新路由自定义错误页面。在这种情况下,终端会显示

ActionController::RoutingError (No route matches "/randomcontrollername"):

并显示rails默认的错误页面。

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery

  unless Rails.application.config.consider_all_requests_local
    rescue_from Exception,                            :with => :render_error
    rescue_from ActiveRecord::RecordNotFound,         :with => :render_not_found
    rescue_from ActionController::RoutingError,       :with => :render_not_found
    rescue_from ActionController::UnknownController,  :with => :render_not_found
    rescue_from ActionController::UnknownAction,      :with => :render_not_found
  end

  private
  def render_not_found(exception)
     render :template => "/error/404.html.erb", :status => 404
  end

  def render_error(exception)
    render :template => "/error/500.html.erb", :status => 500 
  end

end

请你能帮我吗?谢谢。

2个回答

18
你可以使用Rails中的路由通配符实现该功能,它允许你使用通配符将任何动作与路径的任何部分匹配。
为了捕获所有未匹配到的路由,只需在config/routes.rb中定义一个优先级较低的路由映射作为最后一个路由:
在Rails 3中: match "*path" => 'error#handle404' 在Rails 2中: map.connect "*path", :controller => 'error', :action => 'handle404' params[:path]将包含匹配部分。

4
如果您不需要动态错误页面,只需编辑 public/404.htmlpublic/505.html。如果您需要,请参考 Reza.mp 的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接