从视图中设置标题状态

Posted

技术标签:

【中文标题】从视图中设置标题状态【英文标题】:Setting header status from view 【发布时间】:2016-10-25 01:38:54 【问题描述】:

我有一个查看页面errors/401。这专门用于显示状态为 401 的错误,我总是希望以状态 401 呈现该页面。在呈现该页面的控制器中,我这样写

render "error/401", status: 401

我觉得这是多余的。由于此页面始终以特定状态呈现,因此我想在视图页面中指定状态,而不是在控制器中提及,并获得相同的结果。我只想写:

render "error/401"

这可能吗?

【问题讨论】:

我不确定这是否可能,但由于您使用控制器/视图来返回自定义错误页面。除非您另有说明,否则 rails 控制器将始终将 status: 200 添加到您的响应标头中 不,因为您的服务器处理请求/响应 - 在这种情况下是控制器。控制器应该负责您的响应和响应的请求标头,其中包括状态。在您看来,您不应该这样做。话虽如此,您可以将此文件创建为 public/401.html,而您只是说status: 401 网络服务器将服务于 public/401.html。但是,这个 401.html 将是一个静态 HTML 文件,将无法解析其中的任何 ruby​​ 代码。 【参考方案1】:

我想在视图页面中指定状态,不在控制器中提及它

它不属于你的观点。模板应该输出字符,而不是 HTTP 状态代码。

我觉得这是多余的。

是的。 Rails 使用异常来表示和处理此类错误,例如缺少记录会导致 ActiveRecord::RecordNotFound 异常,进而呈现 404 页面。

您可以通过在ApplicationController 中定义通过rescue_from 传递的NotAuthorised 错误来执行相同操作:

class ApplicationController < ActionController::Base
  class NotAuthorised < StandardError; end

  rescue_from NotAuthorised do |exception|
    render 'error/401', status: 401
  end
end

从另一个控制器:

class FooController < ApplicationController
  def index
    raise NotAuthorised
  end
end

【讨论】:

以上是关于从视图中设置标题状态的主要内容,如果未能解决你的问题,请参考以下文章

为不同的视图控制器设置状态栏颜色

状态栏下移视图

在android中动态设置状态栏颜色

无法为视图设置 iOS 状态栏颜色

设置状态栏颜色 - 延迟?

如何将 SwiftUI 状态从特定值更改为新状态值设置动画?