0

过去一天左右,我在 Ruby 1.9.3 中的 Rails 3.2.11 应用程序中一直在做这个,我已经阅读了所有接近这个的 SO 帖子。下面似乎更接近于编写此记录,因为由于 SO 响应,我已经微调了操作。我有一个商品,我想写一个与商品相关的价格记录。为了了解如何创建基本 API,我编写了一个命名空间和一个单独的价格控制器。

在尝试使用我在控制器中为 html 使用的构建操作后,我放弃了这种方法,只是在 JSON 调用中添加了商品 ID,因为我希望用户在 url 中有商品 ID。我更新的 Api::PriceController#create 只是对 Price 模型的基本创建。

商品.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

价格控制器.rb

 class PricesController < ApplicationController
   def create
   @commodity = Commodity.find(params[:commodity_id])
   @price = @commodity.prices.build(params[:price])
 end

api/prices_controller.rb

 module Api
class PricesController < ApplicationController
    respond_to :json
    def create
      respond_with Price.create(params[:price])
    end
    end
   end

路线.rb

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

这是我的卷曲电话:

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

对此的回应是“无法批量分配受保护的属性:prices_attributes”

好的,我相信我应该能够做到这一点,因为另一篇 SO 帖子说,只要我不包括 created_by、updated_by 时间戳,我就应该很好。但我不是。在另一篇 SO 帖子中,一张与我类似的海报让他开始像 AREL 调用一样进行 JSON 调用,并将其包装在 price_attributes 中。拉动这个包装器,使它看起来像这样:

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

返回“Api::PricesController 的未定义方法 `price_url'”。为什么这似乎不起作用?

4

2 回答 2

0

价格没有嵌套价格,accepts_nested_attributes_for :prices价格模型中也没有,商品有。JSON 不好,因为您试图在价格模型中保存价格嵌套属性。在第一个示例中,您的 JSON 应如下所示:

... "{\"commodity\":{\"prices_attributes\":[{\"price\":8,\"buyer\":\"Sam\",\"quality\":\"Bad\",\"commodity_id\":1}]}

注意 JSON 中的“commodity”而不是“price”。第二个 JSON 是完全错误的。

通读API Docs和这个RailsCast以更好地理解 Rails 中的嵌套属性。

于 2013-06-21T22:28:09.247 回答
0

嵌套属性允许您为表单中的其他模型附加表单。因此,在您的情况下,您试图将价格形式嵌套在商品形式中。如果这是您的意图,那么在您的商品类中,您需要附加:prices_attributesattr_accessible

class Commodity < ActiveRecord::Base
    attr_accessible :description, :name, :prices_attributes
    has_many :prices
    accepts_nested_attributes_for :prices
end
于 2013-06-21T22:28:17.857 回答