【问题标题】:respond_to block always renders htmlrespond_to 块总是呈现 html
【发布时间】:2016-06-18 21:01:43
【问题描述】:

到目前为止,我的团队已经使用 HTTP 请求在我们的项目中创建和修改特定的 ActiveRecord 对象。相关的控制器方法只呈现为 json:

render json: { json: 'goes here' }

我正在创建一个基本的 CRUD 接口来执行此操作,它应该呈现一个 HTML 页面 (render :html) 但是,我们还有一个辅助 API,它依赖于能够通过 HTTP 请求调用这些控制器操作并获得一个json 响应返回。

我尝试使用respond_to 块来实现此目的:

respond_to do | format |
    format.json { render json: { json: 'goes here' } }
    format.html # Appropriate view
end

但是,即使使用直接 HTTP 请求(在终端中使用 cURL 进行测试),我总是会收到 HTML 响应。我尝试在路由文件中使用constraint,但即使这样也无法得到 JSON 响应。

为了从 HTTP 请求获得 JSON 响应,同时在请求来自表单时仍呈现适当的视图,我还需要在服务器端还是客户端做些什么?谢谢!

【问题讨论】:

  • Rails 根据客户端提交的 HTTP Accept 标头确定所需的响应格式。您确定您将正确的值传递给您的标头吗?

标签: ruby-on-rails ruby json activerecord


【解决方案1】:

如果您想执行特定格式,例如 json,那么您需要将其传递到请求来自的参数中,键值:format

whatever_path(format: :json)

【讨论】:

  • 我希望我能给你们两个正确的答案。这将有助于我需要在 Rails 代码中提出请求的任何时候,但@smathy 的回答有助于问题描述的用例。
  • 没问题,伙计。你得到了正确的答案,就是这样:)
【解决方案2】:

如果您查看rake routes 的输出,您会看到所有的URI 都有这个(.format) 后缀。括号意味着它是可选的。如果没有提供(并且如果 Accept 标头没有消除请求的歧义),那么 Rails 默认使用 HTML 响应。

因此,在您的 cURL 命令中,只需提供 .json 格式,Rails 就会以正确的方式响应:

curl localhost:3000/foos.json

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多