即使我输入其他状态代码,Rails4 jbuilder也始终返回状态代码200

时间:2013-08-13 07:08:29

标签: ruby-on-rails ruby-on-rails-4

我构建了一个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

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我发现成功调用渲染后跟你要发出的任何状态。在create的底部添加以下内容

render status: 400

参考:https://stackoverflow.com/a/28144206/3826642

您可以将逻辑从该包络方法移动到jbuilder模板,这样您就可以直接将状态从控制器传递到视图。

您在信封方法中的状态只会在呈现的json中,它不是服务器发送的http响应状态代码,而是渲染方法中的那个