2009-10-06 8 views
2

Je me demande pourquoi cela ne fonctionne pas pour moi:Ruby on Rails: « find_create_by_user »

Recipe.find_or_create_by_user_id(current_user.id, :name => "My first recipe") 

qui crée l'amende de recettes si l'on n'existe pas par l'identifiant de l'utilisateur, mais le nom ("Mon première recette ") n'est pas inclus dans la nouvelle entrée créée. Y a-t-il quelque chose que je fais de mal? Je n'arrive pas à comprendre ça.

Répondre

3

Vous pouvez essayer un couple de différentes façons:

Recipe.find_or_create_by_user_id_and_name(current_user.id, "My first recipe") 

Recipe.find_or_create_by_user_id(:user_id => current_user.id, :name => "My first recipe") 
+0

Merci, Michael. Et si l'utilisateur décide de changer le nom de la recette à l'avenir? – Drew

6

Essayez cette façon:

Recipe.find_or_create_by_user_id(current_user.id) do |recipe| 
    recipe.name = 'My first recipe' 
end 

Le bloc ne s'appelé si elle doit créer l'enregistrement.

+0

Merci Tadman. Je n'en avais aucune idée. Merci beaucoup! – Drew

1

Y at-il une chance que vous utilisiez attr_accessible ou attr_protected dans votre modèle de recette? Si le nom n'est pas accessible, alors lorsque vous le transmettez via l'assignation de masse, il ne sera pas assigné comme prévu. Je crois que cela expliquerait pourquoi la méthode de tadman fonctionne et vos tentatives originales n'ont pas fonctionné. Si le nom n'est pas quelque chose qui vous préoccupe sérieusement, vous pouvez envisager de l'exposer via attr_accessible.