我有一个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响应代码吗?或者有更好的方法来干掉我的错误页面配置吗?
答案 0 :(得分:1)
您可以在application_controller.rb
中执行以下操作:
unless Rails.application.config.consider_all_requests_local
rescue_from ActiveRecord::RecordNotFound, with: :render_404
end
在这里,您可以猜到,您可以捕获您感兴趣的任何类型的例外(ActionController::RoutingError
,ActionController::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
原样。