Update_attributes - 不确定它的保存方式

时间:2013-04-12 21:56:28

标签: ruby-on-rails ruby ruby-on-rails-3

在我的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时,是否必须为所有Model的属性提交值?

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

2 个答案:

答案 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]

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

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