如何在不实际渲染网页的情况下渲染 404?
Posted
技术标签:
【中文标题】如何在不实际渲染网页的情况下渲染 404?【英文标题】:How do I render a 404 without actually rendering my web page? 【发布时间】:2018-09-19 02:12:34 【问题描述】:我想在我的 Rails 5.1 应用程序中以特定条件呈现默认的 404 页面。我的控制器里有这个
def index
...
if worker
...
else
puts "page not found"
render :status => 404
end
end
但是,即使满足条件(调用了我的 404 分支),Rails 仍会尝试渲染我的 index.htrml.erb 页面,这会导致其他错误,因为预期的模型属性不存在。有没有办法在不呈现页面的情况下返回 404 状态代码?
【问题讨论】:
可能正在寻找这个? ***.com/questions/2385799/… 【参考方案1】:最简单的方法是:
render file: "#Rails.root/public/404", layout: true, status: :not_found
另一种方法是引发一个错误,该错误将被 rails 捕获为 404
错误包括:ActionController::RoutingError
、AbstractController::ActionNotFound
或 ActiveRecord::RecordNotFound
有not_found
方法,需要的时候可以调用
def not_found
raise ActionController::RoutingError.new('Not Found')
end
def index
...
if worker
...
else
puts "page not found"
not_found
end
end
对于其他格式,您可以只使用head :not_found
【讨论】:
如果您直接使用第一个选项,而不是在方法中或方法中的最后,请像render .... and return
一样使用它【参考方案2】:
最简单的方法是使用状态码 404 渲染 public/404,您可以为 404 页面提供任何特定的布局layout: true 否则 layout: false。然后返回一个假值
render :file => "#Rails.root/public/404", layout: false, status: 404
return false
【讨论】:
谢谢。因此,如果我在 Apache 中定义了自己的 404 页面,我是否会从 Rails 应用程序调用中抛出 404 状态,从而允许呈现我的 Apache 404 页面?render nothing: true, layout: false, status: 404
这将向 HTTP 服务器返回 404 状态,在您的情况下为 Apache。在生产中,apache 将显示配置的 404 页面。以上是关于如何在不实际渲染网页的情况下渲染 404?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不渲染的情况下从 forwardref 组件添加 ref?