2016-04-20 18 views
1

Speichern Ich bin haben folgende ModelleRails verschachtelte Modelle

users (id, name, ...) 
authorizations (id, provider, provider_uid, token, user_id, ...) 

Benutzer has_many Berechtigungen

@user = User.new(first_name: facebook_client.first_name, 
           last_name: facebook_client.last_name, 
           email: facebook_client.email, 
           bio: facebook_client.bio, 
           date_of_birth: facebook_client.birthday, 
           gender: facebook_client.gender, 
           location: facebook_client.location) 

    @user.authorizations.build(
        provider: 'facebook', 
        provider_uid: facebook_client.user_id, 
        oauth_token: facebook_user_token, 
        social_account: SocialAccount.friendly.find('facebook')) 

ich habe eine Validierung

validates :user_id, presence: true 

Aufgrund der oben i Ich kann nicht wh speichern en i @user.save

tun bin ich nicht in der Lage zu verstehen, warum es nicht sparen sollte, wenn ich es bin Gebäude über @user.authorizations.build

+0

weil '@ user.id'' nil' ist, wird es nicht beibehalten. –

+0

@ Зелёный aber es ist nicht gespeichert. wenn ich [an] Benutzer speichere speichert es den Benutzer dann speichert es die verschachtelten Modelle, also speichert es automatisch die Identifikation richtig? –

Antwort

1

Von der documentation:

Wenn Sie, dass ein Verein sicher sein wollen, ist In diesem Fall müssen Sie testen, ob das zugehörige Objekt selbst vorhanden ist, und nicht den verwendeten Fremdschlüssel, um die Zuordnung zuzuordnen.

Das heißt, Sie haben Ihre validates :user_id, presence: true Validierung der folgenden ersetzen:

class Authorization < ActiveRecord::Base 
    belongs_to :user 
    validates :user, presence: true 
end 

class User < ActiveRecord::Base 
    has_many :authorizations, inverse_of: :user 
end 
1

Wenn der angegebene Code abgeschlossen ist, das einfach ist, weil Sie nicht gespeichert haben (beharrte) @user, so hat es keine ID. Es benötigt eine ID, um eine Verknüpfung zu erstellen (die über ihre ID mit diesem Datensatz verknüpft ist).

Wenn Sie in Ihrem Code überprüfen, sollten Sie werden sehen:

@user = User.new... 
@user.id => nil 

Ein Datensatz ohne id keine Assoziationen haben kann (die nicht belongs_to sind).

Verwandte Themen