DRYing up Rails错误页面

时间:2014-11-20 12:19:00

标签: ruby-on-rails ruby-on-rails-4 dry

我有一个Rails应用程序,它是更大的网站的一部分。我希望在整个网站上使用一个404错误页面。目前,我有一个静态页面,它是着陆网站的一部分,由于历史原因,它是从Rails应用程序的public部分提供的:

public/landing/404.html

现在我希望我的Rails应用在404错误的情况下提供该页面。我尝试过的方法改编自this blog post

config/application.rb:
  config.exceptions_app = self.routes

config/routes.rb:
  match '/404', to: redirect('/landing/404'), via: :all

这似乎有效,因为404错误会将landing/404.html页面传递给发出请求的用户代理。但是,它会传递状态为200的页面,因为服务器已成功重定向到静态页面。所以,不符合Web标准(而且不是非常RESTful!)。

我的问题是:我可以提供静态页面但是有404响应代码吗?或者有更好的方法来干掉我的错误页面配置吗?

1 个答案:

答案 0 :(得分:1)

您可以在application_controller.rb中执行以下操作:

unless Rails.application.config.consider_all_requests_local rescue_from ActiveRecord::RecordNotFound, with: :render_404 end

在这里,您可以猜到,您可以捕获您感兴趣的任何类型的例外(ActionController::RoutingErrorActionController::UnknownController或一般Exception),它只会在生产中重定向而在开发过程中,它会显示出真正的异常。

def render_404
  respond_to do |format|
    format.html { render( layout: false, file: Rails.root.join( 'public', 'landing', status.to_s ), status: status ) }
    format.all { render nothing: true, status: 404 }
  end
end

并保持routes.rb原样。