web-dev-qa-db-fra.com

Rails 3: Comment "accepte_ned_attributes_for" fonctionne?

Considérez l'association suivante:

class Product < ActiveRecord::Base
  belongs_to :shop
  accepts_nested_attributes_for :shop
end

Si

params[:product][:shop_attributes] = {"name" => "My Shop"}

et je fais:

@product = Product.new(params[:product])
@product.save

une nouvelle boutique avec nom "My Shop" est créée et affectée à la @product, comme prévu.

Cependant, je ne peux pas comprendre ce qui se passe quand shop_attributes contient quelque chose id, comme:

params[:product][:shop_attributes] = {"id" => "20", "name" => "My Shop"}

Je reçois l'erreur suivante:

Couldn't find Shop with ID=20 for Product with ID=

Question 1

Que cela veut-il dire ?

Question 2

Si tel est le cas, c'est-à-dire le id de la boutique est connu et le magasin avec tel id existe déjà, comment devrais-je créer le @product tel que cette boutique sera assignée?

34
Misha Moroshko

Je pense que vous essayez de déterminer la création d'un nouvel élément associé par rapport à un élément existant.

Pour créer un nouvel article, vous semblez le faire fonctionner. Lorsque vous avez passé l'ID dans Shop_Attributes, cela n'a pas fonctionné, car il examine une association qui n'existe pas encore.

Si vous essayez d'associer à un article existant, vous devez utiliser ce qui suit:

params[:product][:shop_id] = "20"

Cela attribuera la boutique du produit actuel à la boutique avec ID 'Shop_id'. (Le produit devrait avoir une colonne 'shop_id'.)

14
clemensp