Rails: créer sur has_one association
Hi (énorme Rails newbie ici), j'ai les modèles suivants:
class Shop < ActiveRecord::Base
belongs_to :user
validates_uniqueness_of :title, :user_id, :message => "is already being used"
end
et
class User < ActiveRecord::Base
has_one :shop, :dependent => :destroy
end
Quand je suis sur le point de créer une nouvelle boutique, j'obtiens l'erreur suivante:
private method `create' called for nil:NilClass
C'est mon contrôleur:
@user = current_user
@shop = @user.shop.create(params[:shop])
J'ai essayé différentes variantes, par la lecture des guides et des tutoriels ici et là, mais je suis encore plus confus qu'avant et ne peut pas le faire fonctionner. Toute aide serait grandement appréciée.
- Édité question titre de réfléchir à la question. Double de l'Utilisation de construire avec un has_one association dans les rails
- vous pouvez également utiliser
@user.build_shop(params)
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, voici comment faire ce que vous voulez:
Maintenant, voici pourquoi votre version ne fonctionne pas:
Vous avez probablement pensé que cela pourrait fonctionner, car si l'Utilisateur avait une
has_many
rapport à la Boutique,@user.shops.create(params[:shop])
serait travail. Cependant il y a une grande différence entrehas_many
relations ethas_one
relations:Avec un
has_many
rapport,shops
retourne un ActiveRecord objet de collection, qui a des méthodes que vous pouvez utiliser pour ajouter et supprimer des boutiques à partir d'un utilisateur. L'une de ces méthodes estcreate
, ce qui crée une nouvelle boutique et l'ajoute à l'utilisateur.Avec un
has_one
relation, vous n'obtenez pas de retour, tel un objet de collection, mais tout simplement la Boutique objet qui appartient à l'utilisateur ou nil si l'utilisateur ne dispose pas d'un magasin encore. Étant donné que ni la Boutique d'objets, ni nulle ont unecreate
méthode, vous ne pouvez pas utilisercreate
de cette façon avechas_one
relations.@user.create_shop(params[:shop])
. Voir méthodes ajouté par has_one.Une manière plus concise de le faire est:
Voir méthodes ajouté par has_one à Ruby on Rails guides.
@user.create_shop(params[:shop_one_info])
il va créer shop_one, MAIS si vous exécutez@user.create_shop(params[:shop_two_info])
qu'il va supprimer la première boutique et créer de la seconde.@user.build_shop(params)
Deux façons de plus si vous voulez
save
au lieu decreate
:Juste à ajouter aux réponses ci-dessus, -
De syntaxe ci-dessus crée un nouveau record, mais par la suite, il supprime similaire enregistrement existant.
Alternativement, si vous ne voulez pas déclencher supprimer rappel
Ce fil pourrait être utile. Cliquez ici