我构建了一个json视图,在rails4应用程序中的ajax调用之一中返回json。我已经使用了这里提出的想法 https://stackoverflow.com/a/12832116/1560470
但即使我强制执行其他状态代码,我也始终将状态代码设置为200。
我在视图/ managers / create.json.jbuilder中的jbuilder视图如下所示:
if @manager.errors.messages.any?
envelope(json, :unprocessable_entity, @manager.errors.messages) do
json.success false
end
else
envelope(json, :created) do
json.success true
end
end
我的应用程序助手lloks如下:
module ApplicationHelper
def envelope json, status, errors
json.status status
json.data do
yield if block_given?
end
json.errors errors
end
end
我的控制器如下:
def create
@manager = Manager.new manager_params
@saved = ( @manager.valid? && @manager.save )
end
你甚至可以看到我在我的jbuilder视图中将status
参数值作为:unprocessable_entity
传递,但每次响应仍然为200。即使我使用任何状态代码,它也总是返回200.状态代码定义在http://guides.rubyonrails.org/layouts_and_rendering.html
答案 0 :(得分:1)
我遇到了同样的问题,我发现成功调用渲染后跟你要发出的任何状态。在create
的底部添加以下内容
render status: 400
参考:https://stackoverflow.com/a/28144206/3826642
您可以将逻辑从该包络方法移动到jbuilder模板,这样您就可以直接将状态从控制器传递到视图。
您在信封方法中的状态只会在呈现的json中,它不是服务器发送的http响应状态代码,而是渲染方法中的那个