这是一个“为什么它会这样工作”的问题,而不是“我如何让这个工作”。
我的应用程序正在调用返回 JSON 的第三方 REST API,并将结果作为我自己的JSON API 的一部分返回。
我使用的是 Rails 3respond_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。
澄清:@products
第三方 API 返回的对象是纯 JSON —— 一个字符串,您可以看到嵌入在上面的错误日志消息中。发生此错误是因为 Rails 似乎希望对象更多——在 Rails 内部 API 支持中,它是一个 ActiveRecord 对象。
如果我用respond_with
旧样式的 sytax 替换新的
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
然后一切正常。这就是我所做的,所以我没有“如何”的问题,而是有一个“为什么”的问题。
Ryan Daigle关于介绍的帖子解释说,正在发生的事情是意料之中的。
我的问题是:为什么respond_with
除了数据(和 HTTP 状态?)之外还有其他东西,而且显然只是为了POST
.
我并不是说这是错误的,只是想了解Rails 实施的基本原理。