未使用状态码4xx解析javascript响应

时间:2011-09-04 13:01:07

标签: javascript ajax ruby-on-rails-3 http-headers ruby-on-rails-3.1

我在我的控制器中执行以下操作:

def publish
  respond_to |format|
    format.js do
      if allowed_to_publish then
        render :js => 'alert("successful");'
      else
        render :js => 'alert("error");'
      end
    end
  end
end

客户端使用ajax-request访问方法。到目前为止这种方法效果很好,唯一让我感到困惑的是,响应的状态代码总是“200”。

当出现错误并且无法满足请求时,根据错误类型,响应应为4xx或5xx。就我而言,当用户未输入所有必需的详细信息时,publish可能会出错。我认为,正确的状态代码是412 precondition failed

现在,当我更改状态代码时,它不再执行javascript:

def publish
  respond_to |format|
    format.js do
      if allowed_to_publish then
        render :js => 'alert("successful");'
      else
        render :js => 'alert("error");', :status => 412
      end
    end
  end
end

客户端获得相同的响应但状态代码,并且不再执行javascript。响应标头如下:

Date    Sun, 04 Sep 2011 12:29:58 GMT
Server  Apache/2.2.14 (Ubuntu)
X-Powered-By    Phusion Passenger (mod_rails/mod_rack) 3.0.8
X-UA-Compatible IE=Edge
Cache-Control   no-cache
X-Runtime   0.176543
Status  412
Strict-Transport-Security   max-age=172800, includeSubDomains
Keep-Alive  timeout=15, max=100
Connection  Keep-Alive
Transfer-Encoding   chunked
Content-Type    text/javascript; charset=utf-8

并且正文仍为alert("error");。但它没有警觉。

这是浏览器限制(我使用 Firefox 7b ),还是可以使用rails?

如果我想让我的javascript被执行,我必须始终使用200吗?

2 个答案:

答案 0 :(得分:0)

每个状态代码都有意义,200个意味着请求已成功完成。当您获得其他4xx或5xx代码,这意味着那里有一些错误,并且脚本没有运行/返回成功的响应。在这种情况下,您不应该期望相同的输出,但是您可以在Javascript代码中处理这种情况并显示一些有意义的消息,因为请求发生了错误。

答案 1 :(得分:0)

如果200以外的任何事情导致麻烦,为什么不回归呢。无论如何,除非他们正在深入研究HTTP标头,否则没有人会真正看到响应代码。

我不知道为什么它不起作用,但老实说我认为你不应该为自己制造太难的东西。

毕竟,HTTP请求成功,因此200的HTTP响应非常合适。