我已经在Ruby 1.9.3中的Rails 3.2.11应用程序中这样做了一天左右了,我已经阅读了所有与此相关的帖子。下面的代码似乎更接近于让这条记录被写入,因为我已经根据SO的响应对操作进行了微调。我有一个商品,我想写一个与商品绑定的价格记录。为了学习如何创建一个基本的API,我编写了一个名称空间和一个单独的Price控制器。
在尝试使用用于html的控制器中的build操作后,我放弃了这种方法,只是在JSON调用中添加了commodity_id,因为我希望用户在url中有commodity_id。我更新的Api::PriceController#create只是对价格模型的一个基本创建。
Commodity.rb
class Commodity < ActiveRecord::Base
attr_accessible :description, :name
has_many :prices
accepts_nested_attributes_for :prices
end
price.rb
class Price < ActiveRecord::Base
attr_accessible :buyer, :date, :price, :quality, :commodity_id
belongs_to :commodity
end
prices_controller.rb
class PricesController < ApplicationController
def create
@commodity = Commodity.find(params[:commodity_id])
@price = @commodity.prices.build(params[:price])
end
接口/价格_控制器.rb
module Api
class PricesController < ApplicationController
respond_to :json
def create
respond_with Price.create(params[:price])
end
end
end
routes.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”
好吧,我相信我应该能够做到这一点,因为另一篇文章说,只要我不包括created_by,updated_by时间戳,我就应该很好。但我不是。在另一篇SO post中,一篇与我类似的帖子让他的帖子将JSON调用变成了一个AREL调用,并将其封装在一个prices_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”。为什么这看起来不起作用?
发布于 2013-06-22 06:28:09
价格没有嵌套的价格,并且在价格模型中没有accepts_nested_attributes_for :prices
,商品有。JSON很糟糕,因为您试图在价格模型中保存价格嵌套属性。在第一个示例中,您的JSON应该如下所示:
... "{\"commodity\":{\"prices_attributes\":[{\"price\":8,\"buyer\":\"Sam\",\"quality\":\"Bad\",\"commodity_id\":1}]}
请注意JSON中的“商品”而不是“价格”。其次,JSON是完全错误的。
通读API Docs和此RailsCast可以更好地理解Rails中的嵌套属性。
发布于 2013-06-22 06:28:18
嵌套属性允许您为表单中的其他模型附加表单。因此,在您的示例中,您试图将价格表单嵌套在商品表单中。如果这是您想要的,那么在您的commodity类中,您需要将:prices_attributes
附加为attr_accessible
class Commodity < ActiveRecord::Base
attr_accessible :description, :name, :prices_attributes
has_many :prices
accepts_nested_attributes_for :prices
end
https://stackoverflow.com/questions/17245108
复制相似问题