0

Ich benutze Devise für Benutzer.Mehrere t.references werden mit verschachtelten Modellen null

User.rb

belongs_to shop 
has_many tasks 

Show.rb

has_many users 
has_many tasks 

Task.rb

belongs_to user 
belongs_to shop 

, wenn ich eine neue Aufgabe erstellen:

current_user.tasks.create(...) 

die shop_id erhält den Wert von Null, wenn ich die gleichen shop_id wie der Benutzer sein muß.

wenn ich eine neue Aufgabe

current_user.shop.tasks.create(...) 

Ich erhalte die user_id als Null schaffen, sondern bekommt den richtigen Wert für die shop_id.

was fehlt mir?

danke im voraus.

+0

hast du versucht, in 'rails console' zu ​​laufen? – 7urkm3n

+0

yup, dieselben Ergebnisse. –

+0

kannst du dieses 'User.first.tasks.create (...)' ausprobieren? – 7urkm3n

Antwort

0

Wenn

current_user.tasks.create(...) 

läuft Schienen Verein würde nicht wissen, dass es Arbeitsplatz_id zu bevölkert hat, es sei denn Sie es explizit

current_user.tasks.create(shop_id: current_user.shop.id) 

Same um die andere Art und Weise zu senden. Sie können eine bessere Modellierung für diesen Fall mit einer polymorphen Assoziation zwischen Benutzer, Shops und Tasks verwenden. Weitere Details und ein Beispiel finden Sie hier.

Siehe http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

nicht wird Sie denken, dies zu entwickeln zusammen.

0

In current_user.shop.tasks.create(...) sind Sie create direkt auf der tasks Sammlung für eine singuläre shop aufrufen. Dies ist effektiv äquivalent zu:

Shop.find_by(user_id: current_user.id).tasks.create(...) 

Shops möglicherweise mehr als einen Benutzer haben kann, so gibt es nichts explizit in dieser Aussage, dass die neu geschaffene Aufgabe current_user gehören soll.

Ich denke, die einfachste Lösung, um die Aufgabe selbst zu erstellen ist, explizit beide Fremdschlüssel festlegen:

Task.create(shop_id: current_user.shop_id, user_id: current_user.id) 

Obwohl du müss Ihre user und shop Referenzen laden Sie die neu task zugeordnet abholen.

Wenn Sie etwas mehr automatische wollen, sollten Sie eine Verbindung Rückruf mit auf has_many :tasks innerhalb Benutzer wo shop_id für eine Task aus der user ‚s Arbeitsplatz_id gesetzt:

class user < ActiveRecord::Base 
    belongs_to :shop 
    has_many :tasks, before_add: :assign_to_shop 

    def assign_to_shop(task) 
    task.shop = self.shop 
    ... 
    end 
end 
0

Devise current_user Methode zurückgibt gleiche Objekt anzeigen.

# simple example 
    def sign_in 
    session[:current_user] = User.find_by_email(params[:email]) 
    end 

    def current_user 
    session[:current_user] 
    end 

Wenn Benutzer angemeldet ist, dann sollte current_user Methode arbeiten, wie wie rechts unten in.

#1 
current_user.tasks.create(...) 

#2 you can also like this 
t = Task.new(...) 
t.user_id = current_user.id 
t.save 

Sie können in rails console spielen, leicht zu verstehen.

current_user = User.first 
current_user.tasks.create(...) 
+0

Ich änderte nichts, das funktionierte nur an der Konsole und irgendwie hörte es auf. Ich weiß, das hört sich verrückt an, aber das stimmt! –

+0

@ KamalG'ool Hast du dich angemeldet? – 7urkm3n

+0

Ich habe, ich habe das in den Controllern behoben, jedes Mal erstellen, Shop und Benutzer nach current_user zuweisen, werde ich später eine Antwort posten. –