Vielen Dank zuerst einmal für deine Hilfe! Es ist trotzdem ein interessanter Fehler.
Die Sache ist die: Ich muss den Benutzernamen möglicherweise über die Datenbank ändern, da die Route nicht verfügbar ist
Könntest du mir eine Abfrage bereitstellen?
[quote=“sam, post:19, topic:173182”]
Außerdem könntest du die Verwendung von Σ in Benutzernamen über unsere Einstellung „Erlaubte Unicode-Zeichen für Benutzernamen
Ein weiteres Mitglied hat sich mit exakt demselben Problem registriert. Mein Punkt ist: Für uns ist dies kein Randfall. Es gibt buchstäblich Tausende griechische Namen, die am Ende ein Σ (oder ς) verwenden.
Und leider gibt es angesichts unserer primären Altersgruppe (> 40) viele Mitglieder, die ihren Namen auf Facebook in GROSSBUCHSTABEN geschrieben haben (). Wenn sie sich also über Facebook anmelden, wird ihr Name in das Benutzernamen-Feld kopiert…
Ich würde mir wegen Postgres keine Sorgen machen. Wir sollten in SQL immer mit username_lower vergleichen und uns nicht auf LOWER() verlassen, da username_lower nicht einfach die Kleinbuchstaben-Version des Benutzernamens ist. Wir wenden zudem eine Unicode-Normalisierung an.
Ich stimme zu. Eine Workaround-Lösung in User.normalize_username sollte vorerst ausreichen. Im Ruby-Fehlerbericht wird dies bereits diskutiert, und es scheint keine einfache Lösung zu geben. Wir haben jedoch Glück, da wir nur das letzte Zeichen eines Benutzernamens prüfen müssen. Das ist deutlich einfacher als die Prüfung in einem vollständigen Satz.
Richtig. Trotzdem sollte es viel einfacher sein als eine vollständige Implementierung, da wir uns nur um bestimmte Symbole wie Unterstrich, Bindestrich und vielleicht Zahlen kümmern müssen? Das sollte machbar sein.
Ich weiß, dass ich mich von dieser spezifischen Bug-Diskussion wegbewege, aber wenn ich an dieses Problem denke, kann ich nicht leugnen, dass es vermieden werden könnte.
Ich habe festgestellt, dass es in Discourse einige API-Routen gibt, die einen Benutzer über die userId referenzieren, während andere ihn über den Benutzernamen referenzieren. Sollte dies nicht konsistenter sein (zugunsten der userId)?
Vielleicht könnte man etwas umsetzen, wie es derzeit bei Kategorien/Tags der Fall ist: Sowohl den Benutzernamen als auch die userId in der URL angeben, z. B. https://meta.discourse.org/u/chrispanag/4387.
2016 war @eviltrout dagegen, ich bin mir nicht sicher, wie er heute dazu steht.
Jedenfalls habe ich in Discourse einen Workaround in diesem PR implementiert:
Damit wird das Problem mit der neuen Facebook-Anmeldung behoben, indem Benutzernamen, die mit einem Sigma beginnen, in Kleinbuchstaben umgewandelt werden. Das bedeutet, dass Sie nur noch den Benutzernamen von Spiros und aller anderen Benutzer mit einem finalen Sigma in Kleinbuchstaben umwandeln müssen, und das Problem sollte langfristig behoben sein.
Ich liebe es immer noch nicht, überall IDs zu verwenden, aber ich verstehe, dass es viele Fälle gibt, in denen das sinnvoll ist.
In diesen Fällen würde ich etwas wie id-benutzername bevorzugen, wobei der Benutzername alles ist, was wir in eine URL einfügen können. Er könnte sogar vom Router ignoriert werden. Aber zumindest hättest du beim Teilen des Links eine Ahnung, worauf du verlinkst.
Persönlich bin ich ein großer Fan des Stack-Overflow-Stils für Benutzer-Routen:
https://stackoverflow.com/users/17174/sam-saffron
In der Discourse-Welt wäre das:
https://meta.discourse.org/u/17174/sam-saffron
Das gibt dir den Kuchen und du kannst ihn auch essen. Aber ja, ich verstehe den Einwand völlig: „Ich mag die 17174 nirgendwo in der URL, Benutzernamen sind stabil.
Ich denke, es wäre hilfreich, die ID anstelle des Benutzernamens (oder beides, aber mit Abhängigkeit nur von der ID, wie oben erklärt) zumindest auf der Benutzerprofilseite zu verwenden, damit der Administrator den Benutzernamen über die Discourse-Oberfläche ändern kann, ohne den Befehl in der Rails-Konsole ausführen zu müssen, falls beim Benutzernamen etwas schiefgeht.
Wir müssen uns nur um Zeichen kümmern, bei denen sich die JavaScript- und Ruby-Implementierung der Umwandlung in Kleinbuchstaben unterscheiden. Nicht umgekehrt.
Es gibt keine feste Regel, wie der deutsche Kleinbuchstabe „ß“ in Großbuchstaben umgewandelt wird. Es könnte „SS“, „SZ“ oder sogar der neue Großbuchstabe „ẞ“ sein (ja, es gibt einen subtilen Unterschied). Um diesen Vorgang umzukehren, ist nur bei „ẞ“ möglich, und das funktioniert sowohl in Ruby als auch in JavaScript korrekt.
Ich denke, wir sollten Folgendes tun:
@sams Workaround zusammenführen, um das unmittelbare Problem zu beheben
LOWER(username) aus SQL-Abfragen entfernen, da dies einfach eine schlechte™ Praxis ist (z. B. fehlende Unicode-Normalisierung)
Hoffen, dass Ruby das zugrunde liegende Problem behebt
Langfristig: Überlegen, ob wir Benutzer-IDs in Routen einfügen sollten. Ich schätze, der schwierigste Teil wird sein, herauszufinden, wie man mit Anführungszeichen und Erwähnungen umgeht.