Rails动态错误页面(404,422,500)显示为空白

时间:2015-10-15 13:32:20

标签: ruby-on-rails ruby ruby-on-rails-4 configuration routing

我正在将动态错误页面实现到应用程序中,感觉它正在public文件夹中查找(现在不存在的)模板,而不是按照我设置的路径。

config/application.rb我添加了行config.exceptions_app = self.routes来解释此问题。

然后我将以下内容添加到我的路线中:

get "/not-found", :to => "errors#not_found"
get "/unacceptable", :to => "errors#unacceptable"
get "/internal-error", :to => "errors#internal_error"

错误控制器看起来像这样:

class ErrorsController < ApplicationController
  layout 'errors'
  def not_found
    render :status => 404
  end

  def unacceptable
    render :status => 422
  end

  def internal_error
    render :status => 500
  end
end

转到/not-found会显示模板,但访问任何不存在的网址(即/ i-dont-exist)会呈现空白页面。

我能看到的唯一原因是异常处理需要路由,例如get "/404", :to => "errors#not_found",但具有讽刺意味的是,它找不到/ 404的路由(不,不是只是它工作:))。

任何建议,非常感谢。谢谢,史蒂夫。

2 个答案:

答案 0 :(得分:5)

似乎有些设置是错误的。 在你的路线中试试这个:

match '/404', to: 'errors#not_found', via: :all(匹配而非获取)

你在application.rb中提到config.exceptions_app = self.routes,这很好。但请确保在测试更改之前重新启动服务器。

确保您的错误观看文件的名称与ErrorsController中的操作相同。

如果您在控制台中遇到任何(haha)错误,可以发布吗?

答案 1 :(得分:2)

请改为:

<强>的routes.rb

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

<强> errors_controller.rb

class ErrorsController < ApplicationController
  def show
    render status_code.to_s, :status => status_code
  end

  protected
  def status_code
    params[:code] || 500
  end
end
config / application.rb

确保您拥有:

module YourWebsite
  class Application < Rails::Application

    config.exceptions_app = self.routes
    # .. more code ..
  end
end

然后您将需要这些视图,显然;)不要忘记删除公共目录中的错误页面。