在我的Rails API中,我有以下更新模型的行。如您所见,它接受了很多参数。但是,我对此有一些问题,目前的文档没有回答......
@updated_special_deal.update_attributes(:category => params[:category], :title => params[:title], :excerpt => params[:excerpt], :description => params[:description], :original_price => params[:original_price], :deal_price => params[:deal_price], :provider => params[:provider], :product_link => params[:product_link], :conditions => params[:conditions], :phone_number => params[:phone_number], :street => params[:street], :city => params[:city], :postal_code => params[:postal_code], :state => params[:state], :country => params[:country], :expires => params[:expires], :image_file_name => params[:image_file_name], :image_content_type => params[:image_content_type], :image_file_size => params[:image_file_size], :image_updated_at => params[:image_updated_at], :public => true)
通过外部客户端应用程序尝试此PUT请求。我在下面得到了这个回复......
Started PUT "/api/v1/1/special_deals/47?title=The+greatest+deal+ever" for 127.0.0.1 at 2013-04-12 14:39:15 -0700
Processing by Api::V1::SpecialDealsController#update as JSON
Parameters: {"title"=>"The greatest deal ever", "servant_id"=>"1", "id"=>"47"}
ActiveRecord::RecordInvalid - Validation failed: Provider can't be blank, Description can't be blank:
当然,我在模型中写了这些规则。但是,我没有尝试传递Provider属性或Description属性。那么,这里发生了什么?
编辑重新提出问题:如何编写update_attributes以便它只更新PUT请求中包含的属性?
答案 0 :(得分:1)
您应该使用模型名称传递params以更新根元素内部。所以你的params应该是这样的:
{"servant_id"=>"1", "id"=>"47", "special_deal":{"title"=>"The greatest deal ever"}}
在您的控制器操作中,您可以加载模型和关系,然后从“special_deal”参数更新模型。
def update
servant = Servant.find(params[:servant_id])
@special_deal = SpecialDeal.find(params[:id])
@special_deal.servant = servant
@special_deal.update_attributes(params[:special_deal])
end
update_attributes
只需要哈希并更新哈希中的属性。如果您按照我的提法设置了参数,那么params[:special_deal]
将等同于{"title" => "The greatest deal ever"}
。将该哈希传递到更新属性调用将仅更新模型上的title
属性。
答案 1 :(得分:0)
尝试:
卸下:
:provider => params[:provider] and :description => params[:description]
或确保为他们提供实际值。
您的模型具有需要有效值或无值的验证(取决于所使用的确切验证)。