2016-07-31 17 views
0

パッチ要求を送信するときにネストされた属性を更新する際に問題があります。私はレシピを更新するときにrecipe_ingredientsを更新したいと思います。レシピを更新するたびに、レシピは更新されますが、recipe_ingredientsはそのレシピを追加するだけです。ネストされた属性をレールで更新する

`` `

class Recipe < ActiveRecord::Base 
    has_many :recipe_ingredients, dependent: :destroy 
    accepts_nested_attributes_for :recipe_ingredients, allow_destroy: true, update_only: true 
end 

:〜感謝〜

レシピコントローラー

` ``

def update 
    @recipe = Recipe.find(params[:id]) 
    if @recipe.update(recipe_params) 
     @recipe_ingredients = @recipe.recipe_ingredients.all 
     head :no_content 
    else 
     render json: @recipe.errors, status: :unprocessable_entity 
    end 
    end 

    def recipe_params 
    params.require(:recipes) 
     .permit(:name, :category, instructions: [], recipe_ingredients_attributes: [:id, :recipe_id, :ingredient, :measure, :amount]) 
end 

`` `

レシピモデルを助けてください`` ``

カール要求: `` `

curl --include --request PATCH http://localhost:3000/recipes/1 \ 
    --header "Authorization: Token token=..." \ 
    --header "Content-Type: application/json" \ 
    --data '{ 
     "recipes": { 
     "name": "second example recipe", 
     "category": "grill", 
     "instructions": ["do it", "ignore it"], 
     "recipe_ingredients_attributes": [{ 
             "amount": 1, 
             "ingredient": "egg yolk", 
             "measure": "cup" 
             }, 
             { 
             "amount": 3, 
             "ingredient": "soy milk", 
             "measure": "cup" 
             }] 
     } 
    }' 

` ``

+0

この更新プログラムを扱うビューの 'form_for'部分を投稿してください。 – MarsAtomic

+0

私はform_for部分を持っていません。私はまだフロントエンドを作っていない。私はちょうどそれが動作するかどうかをテストするためにカール要求をしてみようとしています。 – tina

+0

あなたの 'recipe.rb'はどうやって関係を二重にチェックするのですか?フォームなしでネストされた属性をテストしたことがないので、私は100%確信していませんが、form_forを使用すると違いが生じる可能性があります。 – MarsAtomic

答えて

0

あなたは正しい既存recipe_ingredientレコードを更新するために、レールのためのカールの要求であなたのrecipe_ingredientsidを送信する必要があります。それ以外の場合は、新しいレコードが作成されます。たとえば、これはid 1recipe_ingredientを更新し、新たな「豆乳」成分を作成します。

"recipe_ingredients_attributes": [{ "id": 1 "amount": 1, "ingredient": "egg yolk", "measure": "cup" }, { "amount": 3, "ingredient": "soy milk", "measure": "cup" }]

+0

はい。これにより問題を解決できます。しかし、新しいレシピを作成するたびにrecipe_ingredientsのIDを追跡する方法がわかりません。 recipe_ingredientsはレシピのネストされた属性なので、私はレシピを更新するときにそれらを更新したい。親を作成したり親を更新したりするときに、子IDを追跡するための "トリック"がありますか?あなたの提案をありがとう〜 – tina

+0

レシピを更新するには、表示するためにまずデータを取得する必要がありますか?つまり、あなたは '更新 'の前に'ショー'しなければならないということです。したがって、 'show'アクションでは、正しいIDを送るためにどの成分を更新しているのかを知るために、そのレシピのすべての成分のIDを返します。レシピを作成するときは、新しい成分を作成しているので、IDを知る必要はありません。 – Canh

関連する問題