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 を使用する場合、モデルのすべての属性の値を送信する必要がありますか?

編集 質問を言い換える: PUT リクエストに含まれる属性のみを更新するように update_attributes を作成するにはどうすればよいですか?

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"}ます。そのハッシュを update attributes 呼び出しに渡すとtitle、モデルの属性のみが更新されます。

于 2013-04-12T22:02:36.877 に答える
0

試す:

削除:

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

または、実際の値が提供されていることを確認してください。

モデルには、有効な値を必要とするか、まったく必要としない検証があります (使用される正確な検証によって異なります)。

于 2013-04-12T22:04:32.900 に答える