0

在我的 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 请求中未包含的参数会发生什么情况,他们是否只是尝试使用空白值更新模型?
  • 如果是这种情况,我是否必须在使用 update_attributes 时为模型的所有属性提交值?

编辑 改写问题:如何编写 update_attributes 以便它只更新 PUT 请求中包含的属性?

4

2 回答 2

1

您应该使用您的模型名称传递要在根元素内部更新的参数。所以你的参数应该是这样的:

{"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模型上的属性。

于 2013-04-12T22:02:36.877 回答
0

尝试:

删除:

:provider => params[:provider] and :description => params[:description]

或确保为它们提供实际值。

您的模型具有需要有效值或不需要有效值的验证(取决于使用的确切验证)。

于 2013-04-12T22:04:32.900 回答