0

Mit Rails 5, versuche ich Omniahuth-Facebook und Clearance für Benutzer-Authentifizierung zu implementieren.Stop-Assoziationen von Validierung in Rails 5

Hinweis: Mein Code ist genau wie this Gist

ich es meistens bekommen habe zu arbeiten. Wenn Sie jedoch Facebook zur Registrierung verwenden (dh ein Benutzer hat die Website nie besucht), gibt Rails die Fehlermeldung Validation failed: User must exist aus. Ich habe das Problem auf diesen Block in dem Gist verengt:

def self.create_with_omniauth(auth_hash) 
    create! do |auth| 
     auth.provider = auth_hash["provider"] 
     auth.uid = auth_hash["uid"] 
     auth.token = auth_hash["credentials"]["token"] 
    end 
    end 

Wenn er trifft, dass es versucht, create! ohne auth.user Objekt vorhanden ist, und schlägt fehl. Hier ist der relevante Code aus dem sessions Controller:

#-- Spectically, the line below 
authentication = Authentication.find_by_provider_and_uid(auth_hash["provider"], auth_hash["uid"]) || Authentication.create_with_omniauth(auth_hash) 
#-- More code, for context 
if authentication.user 
    user = authentication.user 
    authentication.update_token(auth_hash) 
    @next = root_url 
    @notice = "Signed in!" 
else 
    user = User.create_with_auth_and_hash(authentication,auth_hash) 
    @next = edit_user_path(user) 
    @notice = "User created - confirm or edit details..." 
end 

Das einzige, was ich aus dem Gist bin fehlt, ist die Struktur seiner Authentications Tisch. Mit Hilfe der Kontext Hinweise fand ich, habe ich diese Tabelle:

def change 
    create_table :authentications do |t| 
     t.string :provider 
     t.string :uid 
     t.string :token 
     t.references :user, foreign_key: true 

     t.timestamps 
    end 
    end 

Wenn mehr Informationen benötigt werden, werde ich das, was ich kann

Antwort

3

In Rails 5 belongs_to von http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html Standard erforderlich ist, so dass Sie‘ Ich bekomme einen Validierungsfehler ohne es.

In diesem Beispiel versuchen Sie Authentication Objekt ohne User zu erstellen, deshalb erhalten Sie "Validierung fehlgeschlagen: Benutzer muss existieren".

Wenn Sie wirklich Authentication Objekt ohne Benutzer erstellen möchten, sollte diese Arbeit:

class Authentication < ActiveRecord::Base 
    belongs_to :user, oprional: true 
end