【问题标题】:Rails and respond_with: why are the status codes not right?Rails 和 respond_with:为什么状态码不对?
【发布时间】:2013-04-01 18:32:40
【问题描述】:

我正在尝试使用基本的 Rails 控制器并同时拥有更细粒度的控制。如果我正在进行 :new 操作,我会用我的新 @instance 响应,我会得到状态代码 200 并呈现 :new 模板。在展会上,同样的东西,不同的模板。到现在为止还挺好。但是,在创作过程中,我遇到了一些意想不到的事情。如果新记录成功并且我在上面调用respond_with,我将被重定向到显示(状态码302),这是正确的。但是,如果由于记录无效而无法创建新记录,则默认的 respond_with 会通过发出状态代码 200 并呈现新模板来响应。模板是对的,状态码是不对的。这种情况下响应码不应该是422(不可处理实体)吗?

【问题讨论】:

  • 我从未见过 Rails 返回 422。在这种情况下似乎是合适的,但我认为 Rails 默认不会返回它。也许它会在 JSON 响应中?你总是可以通过在你的render 中包含一个status: :unprocessable_entity 来强制它。
  • 如何在respond_with中设置状态?那是我的问题。此外,从语义的角度来看,render 与响应包有什么关系?似乎渲染将数据包捆绑在一起并将其传递给机架处理程序。为什么我不能在渲染范围之外设置响应内容?我发现这是限制。

标签: ruby-on-rails http responders


【解决方案1】:

Rails 返回 200 响应,因为它成功呈现了“新”模板。对于非 AJAX 请求,这通常可以正常工作,因为在这种情况下您还会向用户显示验证错误,以便他们知道发生了什么。

您需要 422 响应的唯一原因是,如果信息是通过 AJAX 提交的,并且您的客户端 JavaScript 取决于响应代码来知道该做什么。就像 Jim 所说,如果需要,您始终可以使用 :status 选项强制呈现响应代码。在默认的“简单”情况下,虽然不涉及 AJAX,但您可能不需要它。

更新:jQuery 客户端可能依赖于响应代码,方法是在 .ajax 函数中包含“错误”回调,或者通过 .ajaxError

【讨论】:

  • 我不同意。状态代码与是否呈现响应无关。无论状态码如何,HTTP 响应都有一个以某种格式编码的正文。任何浏览器都会呈现带有有效 HTML 正文的 HTTP 404 错误响应。状态码实际上对浏览器很重要。另一方面,AJAX 响应的行为不同。您是否曾经尝试过使用 jQuery 等来自 Rails 的带有 4xx 状态码的 javascript 正文发出 AJAX 响应?我可以告诉你,这行不通。 jQuery 不会从非 200 响应中评估正文。
  • 而且没有成功的“新”模板渲染。 Rails 构建响应,但不渲染它。浏览器呈现它。 Rails 构建了许多响应数据包,包括 404 和 500 标准响应,它们总是由浏览器呈现,否则你不会在开发模式下看到漂亮的回溯。
  • Rails 有一个名为render 的方法,在处理控制器操作时会显式或隐式调用该方法。在 Rails 命名法中,将此过程称为“渲染”是正常的。从这个意义上说,浏览器将“渲染呈现的响应”。也许是一个重载的术语,但绝不是不正确的。
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多