【发布时间】:2012-06-19 20:25:34
【问题描述】:
这是一个“为什么它会这样工作”的问题,而不是“我如何才能做到这一点”。
我的应用正在调用返回 JSON 的第三方 REST API,并将结果作为我的自己的 JSON API 的一部分返回。
我使用的是 Rails 3 respond_to 和 respond_with 方法;在 GET 请求的情况下,这可以按我的预期工作,只是通过 JSON。
在POST 的情况下,它做的更多,包括从返回的对象创建一个URL 以传递:location 选项。但由于我的对象只是 JSON(不是 ActiveRecord),我得到一个错误。
例如...
# POST /api/products.json with params id=:id
def create
query_string = "#{user_id}&id=#{params[:id]}"
@products = third_party_api_wrapper.products(query_string, 'POST')
respond_with @products
end
我的第 3 方 API 包装器发出一个 POST 请求,该请求返回正常,然后 Rails 返回一个 500 错误,记录如下:
NoMethodError (undefined method `{"response":{"message":"product 4e1712d9ec0f257c510013f8 selected"}}_url' for #<MyController>
Rails 希望我的 @products 对象知道如何创建位置 URL。
澄清:第三方 API 返回的 @products 对象是纯 JSON —— 一个字符串,您可以在上面的错误日志消息中看到嵌入的字符串。发生此错误是因为 Rails 似乎希望该对象更多——在 Rails 内部 API 支持中,它是一个 ActiveRecord 对象。
如果我用旧样式的 sytax 替换新的 respond_with
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
然后一切正常。这就是我所做的,所以我没有“如何”的问题,而是有一个“为什么”的问题。
简介中的Ryan Daigle's post 解释说正在发生的事情是意料之中的。
我的问题是:为什么respond_with 期望除数据(和 HTTP 状态?)以外的任何东西,而且显然只针对POST。
我并不是说这是错误的,只是试图理解 Rails 实现的基本原理。
【问题讨论】:
-
我不确定你在这里问/说什么。你能澄清一下吗?你是... (1) 问为什么
respond_with不适合你? (2) 说您使用的第 3 方 API 不返回“仅”数据和状态码? (3) 问“为什么 API 应该返回数据以外的任何东西?” -
如果您的主要问题是“为什么 API 应该返回数据以外的任何内容(以及 HTTP 状态?)。我并不是说这是错误的,只是想了解其基本原理。”也许它会帮助我们提供有关 API 的更多细节。
-
请输出
@products并告诉我们结果。
标签: ruby-on-rails-3 json rest respond-to