【问题标题】:How to send http-status using JBuilder Gem如何使用 JBuilder Gem 发送 http 状态
【发布时间】:2014-07-07 13:39:58
【问题描述】:

我正在使用 Rails 3.0.19 和 JBuilder Gem 2.0.6 来呈现 JSON 响应。

JBuilder:https://github.com/rails/jbuilder

以下是用于为特定 API 发送错误消息的代码。

render :json, :template=>"/api/shared/errors.json.jbuilder", :status=> :bad_request 

由于某种原因,客户端收到 200-ok 状态。虽然,我预计 400 (bad_request)。

有什么帮助吗?

这是我的详细代码:

  def render_json_error_messages
    #render :template=> "/api/shared/errors.json.jbuilder", :status=> :bad_request, :formats => [:json]
    respond_to do |format|
      format.json {
        render :template=> "/api/shared/errors.json.jbuilder", :status=> 400
      }
    end
  end

在 before_filter 方法中,我使用render_json_error_messages

【问题讨论】:

  • errors.json.jbuilder 是不是部分的?
  • 不,不是部分的。它是一个完整的 Json.jbuilder 文件
  • 更改模板路由并判断是否失败。
  • 我已将模板 URL 更改为“/ap/shared/errors.json.jbuilder”,是的,它失败了。
  • 我正在研究,看起来 jbuilder 对此有一些问题。但我从来没有遇到过这种情况。 stackoverflow.com/questions/18202750/…

标签: ruby-on-rails json http-status-codes


【解决方案1】:

这行得通:

控制器

def some_action
  render status: :bad_request
end

some_action.jbuilder

json.something "test"

【讨论】:

    【解决方案2】:

    尝试将 jbuilder 渲染为字符串,然后设置状态...适用于 Rails 4.1.4

    jstr = render_to_string( template: 'api/shared/index.jbuilder', locals: { nodes: @nodes})
    respond_to do |format|
      format.html
      format.json { render json: jstr, status: :bad_request }
    end
    

    其他方法也可以

    format.json { render template: 'api/shared/index.jbuilder', status: 404 }
    

    【讨论】:

    • 感谢 Girish,它仍然在我的 Rails 3.0.9 上发送 300 OK。你能快速试用一下这个 Rails 版本吗?顺便说一句,我在 BeforeFilter 中有这个渲染代码,我可以给你任何关于这个问题的提示。
    • Girish 不行。在我的问题的底部,我更新了我的代码。请让我知道它是否有帮助。
    • @SatyaKalluri 您是否在日志中看到“过滤器链因 :render_json_error_messages 渲染或重定向而停止”??
    • 绝对没有@girishso
    • 创建了一个 rails 3.0.19 项目...它与 before_filter github.com/girishso/checkjson curl -i 127.0.0.1:3000/nodes.json 一起按预期工作
    【解决方案3】:

    我不了解 Rails 3.0,但我可以通过在控制器操作中简单地添加 respond_to 块来提供适当的状态。例如,我有一个create,如下所示:

    def create
      # ... create logic
    
      respond_to do |format|
        format.html
        format.json {
          render status: :created, success: true
        }
    end
    

    上面的代码将我的状态码设置为201并呈现app/views/orders/create.json.jbuilder

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      或许可以反过来思考:

      @pictures = ...
      respond_to do |format|
        format.html
        format.json do 
          if @error.present? # @error contains some error message
            render json: @error, status: :unprocessable_entity
          else
            render template: 'api/shared/index.jbuilder'
          end
        end
      

      api/shared/index.jbuilder

      json.array! @pictures, :id, :filename, :width, :height
      

      适用于 Rails5.1.4

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-07
        • 2018-05-17
        • 1970-01-01
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        相关资源
        最近更新 更多