Rails json POST传递NULL值

时间:2013-06-24 16:44:30

标签: json ruby-on-rails-3

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

commodity.rb

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

prices.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

的routes.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}*

我没看到什么? thanx,sam

1 个答案:

答案 0 :(得分:0)

我认为你总体上试图错误地使用嵌套属性。当你正确使用它时,你只发布给商品控制器。在这种情况下,您将使用price_attributes中传递的价格更新商品。

要实现这一点,您需要将:prices_attributes添加到商品方法的attr_accessible方法

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

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

一般情况下,请在帖子后检查rails控制台,看看params的外观,并确保它们符合您的预期。