2017-10-30 2 views
0

Ich bin derzeit Benutzerdaten von einer SAML-Assertion bekommen und Benutzer in einem lokalen DB auf der Grundlage dieser Informationen erstellen:Ruby on Rails/Active: Datensätze mit first_or_initialize Aktualisierung verursacht RecordNotUnique

mapped_role = map_role user_role 
user = User.where(email: auth_attrs.single('Email')).first_or_initialize do |u| 
    u.firstname = auth_attrs.single('First Name') 
    u.uid = auth_attrs.single('UID') 
    u.provider = resp.provider 
    u.role = mapped_role 
end 

Das funktioniert gut genug, Wenn sich jedoch die Benutzerdetails ändern (z. B. ihre Rolle ändert sich), werden diese Daten nicht in der Datenbank aktualisiert. Was ich versucht habe, ist das Verschieben der Rollenzuordnung aus dem do Block (auf dem user Objekt, das von first_or_initialize zurückgegeben wird) und dann Aufruf einer Folge user.save, aber dies führt zu einem ziemlich roten Bildschirm, der mir mitteilt, dass die Spalte 'E-Mail' ist nicht einzigartig. Ich möchte hier keinen neuen Datensatz erstellen, sondern nur einen vorhandenen aktualisieren. Gibt es hier ein besseres Muster?

Edit: Ich habe versucht die verschiedenen Ansätze here ausgelegt, aber sie führen zu den gleichen SQLite3 Fehler. Es scheint, als würde ich etwas vermissen.

Edit2: Es sieht so aus, als ob Devise versucht, etwas hinter den Kulissen mit einem eigenen E-Mail-Feld (?) Zu tun.

Antwort

2

ich glaube, ich würde darüber gehen wie so

mapped_role = map_role user_role 
# find the user or initatiate an new un-persisted user 
user = User.find_or_initialize_by(email: auth_attrs.single('Email')) 
attributes = {firstname: auth_attrs.single('First Name'), 
       uid: auth_attrs.single('UID'), 
       provider: resp.provider, 
       role: mapped_role} 
# attempt to update the above record with the appropriate attributes 
# this will set the attributes and fire #save 
if user.update(attributes) 
    # successful 
else 
    # handle validation errors 
end 

diese Weise keine Notwendigkeit für logische Handhabung von Benutzern gibt es die bereits beibehalten werden und neue Benutzer.

+0

Ich werde dies als richtig markieren, da es die gestellte Frage löst. Ich glaube, mein Problem hatte damit zu tun, dass Devise in meinen Benutzertisch eingegriffen hat und Chaos angerichtet hat. –

Verwandte Themen