1

我不确定为什么下面的 cURL 调用似乎没有通过 json 将我期望的值传递给我在 Ruby 1.9.3 中的 Rails 3.2.11 应用程序。我有一个带有价格接受_nested_attributes 的商品模型,但是使用我在 SO 上找到的几个 cURL 调用,除了应该作为线索的商品 ID 之外,每个属性都带有 NULL。但这对我来说并不明显。当然,价格模型有一个商品 ID 字段,您可以通过我的调用看到发行人必须知道商品 ID = 1 的价格。下面的两个调用都产生了相同的结果。它可能只是一个放错位置的逗号或其他东西,但没有看到它。

商品.rb

 class Commodity < ActiveRecord::Base
   attr_accessible :description, :name
   has_many :prices
   accepts_nested_attributes_for :prices
 end

价格.rb

 class Price < ActiveRecord::Base
   attr_accessible :buyer, :date, :price, :quality, :commodity_id
   belongs_to :commodity
 end

api/prices_controller.rb

 module Api
class PricesController < ApplicationController
  respond_to :json

      def create
        commodity = Commodity.find(params[:commodity_id])
         respond_with :api, :commodity, commodity.prices.build(params[:price])   
  end
 end

路线.rb

 namespace :api, defaults: {format: 'json'} do
   resources :commodities, only: [:show, :new, :create] do
     resources :prices
   end
 end

这是两个 cURL 调用:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST http://localhost:3004/api/commodities/1/prices -d "{\"commodity\":{\"prices_attributes\":[{\"price\":\'8\',\"buyer\":\"Sam\",\"quality\":\"Bad\",\"commodity_id\":1}]}}"\",\"commodity_id\":1}]}}"

第二个基于在 SO 中搜索 NULL 响应:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST http://localhost:3004/api/commodities/1/prices -d "price[price]=6" -d "price[buyer]=Sam" -d "price[quality]=good" -d "price[commodity_id]=1"

它们都产生:

{"buyer":null,"commodity_id":1,"created_at":null,"date":null,"id":null,"price":null,"quality":null,"updated_at":null}*

我没看到什么?谢谢,山姆

4

1 回答 1

0

我认为总体而言,您尝试错误地使用嵌套属性。当您正确使用它时,您只向您的商品管理员发布。在这种情况下,您将使用您在prices_attributes 中传递的价格来更新商品。

要使其正常工作,您需要将 :prices_attributes 添加到您的商品方法的 attr_accessible 方法中

您的示例没有存储属性,因为 params[:price] 没有您期望的数据。params[:commodity][:prices_attributes][0] 有正确的数据。乙

如果您有 api 来发布和更新或创建单一价格,您应该将 curl 更改为使用 params[:price] 并仅以价格哈希发送数据

通常,在发布后检查 rails 控制台以查看参数的外观并确保它们是您所期望的。

于 2013-07-01T01:51:10.630 回答