如何在不实际渲染网页的情况下渲染 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::RoutingErrorAbstractController::ActionNotFoundActiveRecord::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?

如何在不应用盐堆栈的情况下渲染和转储文件 sls

如何在不渲染地图的情况下获取用户位置数据 - Leaflet

SDL2:如何在不清除屏幕的情况下进行渲染