我在我的控制器中执行以下操作:
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
吗?
答案 0 :(得分:0)
每个状态代码都有意义,200个意味着请求已成功完成。当您获得其他4xx或5xx代码,这意味着那里有一些错误,并且脚本没有运行/返回成功的响应。在这种情况下,您不应该期望相同的输出,但是您可以在Javascript代码中处理这种情况并显示一些有意义的消息,因为请求发生了错误。
答案 1 :(得分:0)
如果200
以外的任何事情导致麻烦,为什么不回归呢。无论如何,除非他们正在深入研究HTTP标头,否则没有人会真正看到响应代码。
我不知道为什么它不起作用,但老实说我认为你不应该为自己制造太难的东西。
毕竟,HTTP请求成功,因此200
的HTTP响应非常合适。