Hallo (großer Rails-Neuling hier), ich habe folgende Modelle:
class Shop < ActiveRecord::Base
belongs_to :user
validates_uniqueness_of :title, :user_id, :message => "is already being used"
end
und
class User < ActiveRecord::Base
has_one :shop, :dependent => :destroy
end
Wenn ich einen neuen Shop erstellen möchte, wird folgende Fehlermeldung angezeigt:
private method `create' called for nil:NilClass
Das ist mein Controller:
@user = current_user
@shop = @user.shop.create(params[:shop])
Ich habe verschiedene Variationen ausprobiert, indem ich hier und da Anleitungen und Tutorials gelesen habe, aber ich bin verwirrter als zuvor und kann es nicht zum Laufen bringen. Jede Hilfe wäre sehr dankbar.
ruby-on-rails
Neko
quelle
quelle
@user.build_shop(params)
Antworten:
Hier erfahren Sie zunächst, wie Sie das tun, was Sie wollen:
Hier ist der Grund, warum Ihre Version nicht funktioniert hat:
Sie dachten wahrscheinlich, dass dies funktionieren könnte, denn wenn der Benutzer eine
has_many
Beziehung zu Shop@user.shops.create(params[:shop])
hätte , würde dies funktionieren. Es gibt jedoch einen großen Unterschied zwischenhas_many
Beziehungen undhas_one
Beziehungen:Gibt mit einer
has_many
Beziehungshops
ein ActiveRecord-Auflistungsobjekt zurück, das Methoden enthält, mit denen Sie einem Benutzer Shops hinzufügen und daraus entfernen können. Eine dieser Methoden besteht darincreate
, einen neuen Shop zu erstellen und dem Benutzer hinzuzufügen.Mit einer
has_one
Relation erhalten Sie kein solches Sammlungsobjekt zurück, sondern einfach das Shop-Objekt, das dem Benutzer gehört - oder null, wenn der Benutzer noch keinen Shop hat. Da weder Shop-Objekte noch Null einecreate
Methode haben, können Siecreate
diese Methode nicht fürhas_one
Beziehungen verwenden.quelle
@user.create_shop(params[:shop])
. Siehe von has_one hinzugefügte Methoden .Eine präzisere Möglichkeit, dies zu tun, ist:
Siehe die von has_one hinzugefügten Methoden in den Ruby on Rails- Handbüchern .
quelle
@user.create_shop(params[:shop_one_info])
es beispielsweise ausführen , wird shop_one erstellt, ABER wenn Sie es ausführen@user.create_shop(params[:shop_two_info])
, wird der erste Shop gelöscht und der zweite erstellt.@user.build_shop(params)
Zwei weitere Möglichkeiten, wenn Sie möchten,
save
anstattcreate
:quelle
Nur um die obigen Antworten zu ergänzen -
Die obige Syntax erstellt einen neuen Datensatz, löscht jedoch anschließend einen ähnlichen vorhandenen Datensatz.
Alternativ, wenn Sie keinen Rückruf zum Löschen auslösen möchten
Dieser Thread könnte hilfreich sein. Klicke hier
quelle