2012-05-10 3 views
10

In der gleichen Weise wie die meisten Websites arbeiten, sollte ich "UsErNaMe" in der Datenbank speichern, aber Benutzer mit "Benutzername" anmelden.Devise: Erlaube Benutzern, sich als "UsErNaMe" zu registrieren, aber mit "Benutzername"

Dies ist ein ziemlich offensichtliches und notwendiges Feature, und viele Leute scheinen es gefragt zu haben, aber die Lösung, auf die ich stolpere, scheint von Devise's eigener Dokumentation getrennt zu sein.

Betrachten wir zum Beispiel dieses Blog-Post: http://anti-pattern.com/2011/5/16/case-insensitive-keys-with-devise

[...] Sie haben wahrscheinlich in das Problem führen, dass einige Nutzer gerne bestimmte Buchstaben in ihren Anmeldungen eingeben (E-Mail und/oder Benutzername in Großbuchstaben), aber erwarten, dass es Groß- und Kleinschreibung sein, wenn sie in. A nicht Ansinnen [...]

Kühle zu unterzeichnen versuchen! Das ist, was ich will.

Seine Lösung:

# config/initializers/devise.rb 
Devise.setup do |config| 
    config.case_insensitive_keys = [:email, :username] 
end 

Das ist die Lösung, die ich Befund halten. Aber hier ist die Dokumentation für diese Konfigurationsoption:

# Configure which authentication keys should be case-insensitive. 
# These keys will be downcased upon creating or modifying a user and when used 
# to authenticate or find a user. Default is :email. 
config.case_insensitive_keys = [ :username, :email ] 

Insbesondere gilt Folgendes: „Diese Schlüssel werden downcased bei der Erstellung/eines Benutzers zu ändern.“ Mit anderen Worten, der Benutzername wird in der Datenbank heruntergestuft.

Um zu überprüfen:

User.create username: "UsErNaMe", password: "secret", email: "[email protected]" 
#=> <User username="username"...> 

Bin ich etwas schmerzhaft offensichtlich fehlt?

Antwort

10

Von devise wiki: Sie müssen die find_first_by_auth_conditions Methode des Geräts in Ihrem Modell überschreiben.

Active Beispiel:

def self.find_first_by_auth_conditions(warden_conditions) 
    conditions = warden_conditions.dup 
    if login = conditions.delete(:login) 
    where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first 
    else 
    where(conditions).first 
    end 
end 

können Sie OR lower(email) = :value Teil entfernen, wenn Sie Auth brauchen nicht zu per E-Mail.

Auf diese Weise müssen Sie nicht username in case_insensitive_keys auflisten, und es würde nicht in der Datenbank heruntergestuft werden.

+0

Dies funktioniert natürlich nur, wenn Sie im Benutzermodell ein virtuelles Attribut "login" deklariert haben, legen Sie dies als Ihr Gerät fest: authentication_keys => [: login] und verwenden Sie dieses Attribut in Ihrem Anmeldeformular. –

+6

Auch wenn Sie die Groß- und Kleinschreibung in der Datenbank zulassen, sollten Sie sicherstellen, dass die Eindeutigkeit nicht zwischen Groß- und Kleinschreibung unterscheidet. Andernfalls erlauben Sie sowohl "Benutzername" als auch "Benutzername". Fügen Sie also validates_uniqueness_of hinzu: username,: case_sensitive => false –

+0

Works. Auch, guter Vorschlag, viktor. – danneu

Verwandte Themen