Nombre de usuario Unicode con Σ como carácter final provoca un error al cargar la página de perfil

¡En primer lugar, muchas gracias por tu ayuda! De todos modos, es un bug interesante.

El caso es que podría necesitar cambiar el nombre de usuario directamente en la base de datos, ya que la ruta no está disponible :sweat_smile:

¿Podrías proporcionarme una consulta?

Creo que esto no es posible, porque entonces prohibiría muchos nombres que comienzan con Σ en Grecia (y esencialmente rompería los inicios de sesión de Facebook para esos usuarios). ¿Puedo prohibir un patrón regex específico? De modo que me asegure de que el Σ esté al menos al final.

1 me gusta

Otro miembro se registró con exactamente el mismo problema. Mi punto aquí es que, para nosotros, esto no es un caso excepcional. Literalmente hay miles de nombres en griego que usan la letra Σ (o ς) al final del nombre.

Y, desafortunadamente, dado nuestro grupo de edad principal (> 40), hay muchos miembros que tienen su nombre escrito en mayúsculas en Facebook (:sweat_smile:), por lo que cuando usan el inicio de sesión con Facebook, su nombre se copia en el campo de nombre de usuario…

4 Me gusta

No me preocuparía por Postgres. Siempre debemos comparar con username_lower en SQL y no depender de LOWER(), porque username_lower no es simplemente la versión en minúsculas del nombre de usuario. También aplicamos normalización Unicode.

Estoy de acuerdo. Añadir una solución alternativa a User.normalize_username debería ser suficiente por ahora. Ya se ha hablado algo sobre esto en el informe de error de Ruby y parece que no hay una solución sencilla. Sin embargo, tenemos la suerte de que solo necesitamos verificar el último carácter de un nombre de usuario. Eso es mucho más fácil que hacerlo en una oración completa.

4 Me gusta

Bueno… ¿cómo se manejaría este nombre de usuario?

Mayúsculas: ΧΡΗΣΤΟΣ_ΠΑΝΑΓΙΩΤΑΚΟΠΟΥΛΟΣ
Minúsculas: χρηστος_παναγιωτακοπουλος o χρηστοσ_παναγιωτακοπουλος

NodeJs lo maneja correctamente, pero si solo verificas el último carácter del nombre de usuario, el problema persistirá.


(Casi todos los nombres masculinos en griego, tanto de pila como de apellido, terminan en Σ)

3 Me gusta

Correcto. Aun así, debería ser mucho más sencillo que una implementación completa, ya que solo tenemos que preocuparnos por ciertos símbolos como el guion bajo, el guion y quizás los números. Eso debería ser factible.

2 Me gusta

Sé que me estoy alejando de la discusión específica sobre este error, pero cuando pienso en este problema, no puedo ignorar el hecho de que se podría haber evitado.

He descubierto que hay algunas rutas de API en Discourse que hacen referencia a un usuario mediante userId, mientras que otras lo hacen mediante username. ¿No debería ser esto más consistente (a favor del userId)?

Quizás se podría implementar algo similar a lo que ocurre ahora con las categorías y etiquetas: incluir tanto el username como el userId en la URL, por ejemplo: https://meta.discourse.org/u/chrispanag/4387.

Solo una idea :sweat_smile:

2 Me gusta

Esto requerirá un esfuerzo de limpieza; definitivamente he visto algunas llamadas a LOWER().

4 Me gusta

Esto ha surgido a lo largo de los años: Update quotes and mentions when username is changed - #10 by sam

En 2016, @eviltrout se oponía a ello; no estoy seguro de cuál es su postura actual.

De todos modos, tengo una solución temporal en Discourse en esta PR:

Resolverá el problema de la nueva inscripción en Facebook convirtiendo a minúsculas cualquier nombre de usuario que comience con sigma. Esto significa que solo necesitas corregir el nombre de usuario de Spiros y el de cualquier otro usuario con sigma final, convirtiendo a minúsculas, y el problema debería desaparecer a largo plazo.

(Se espera la fusión de la PR)

4 Me gusta

Muchas gracias @sam. ¡Tu ayuda fue inmensa!

¿Hay alguna manera de hacer eso desde la consola de Rails? (Como el usuario está roto, no hay forma de hacerlo a través del panel de administración…)

1 me gusta

Sí, esto debería funcionar

./launcher enter app
rails c
u = User.find_by(username: 'ΣΠΥΡΟΣ')
u.username = 'σπυρος'
u.username_lower = 'σπυρος'
u.save!
4 Me gusta

Aún no me encanta usar IDs en todas partes, pero entiendo que hay muchos casos en los que tiene sentido.

En esos casos, preferiría algo como id-usuario, donde usuario es cualquier cosa que podamos incluir en una URL. Incluso podría ser ignorado por el enrutador. Pero al menos, al compartir el enlace, tendrías una idea de a qué estás enlazando.

6 Me gusta

En cuanto a PostgreSQL, parece que configurar las colaciones adecuadas soluciona el problema:

➜  discoursesmall git:(master) psql -d discourse_development
psql (13.1 (Ubuntu 13.1-1.pgdg20.10+1))
Escriba "help" para obtener ayuda.

discourse_development=# SELECT lower('ΣΠΥΡΟΣ');
 lower  
--------
 σπυροσ
(1 fila)

discourse_development=# SELECT lower('ΣΠΥΡΟΣ' COLLATE "und-x-icu"); 
 lower  
--------
 σπυρος
(1 fila)

Fuente: PostgreSQL: Re: BUG #15805: Problem with lower function for greek sigma (Σ) letter

7 Me gusta

Aparentemente, hay otros caracteres Unicode que tienen transformaciones similares, por ejemplo: ‘ß’ → ‘SS’ (alemán).

Es interesante investigar cómo los maneja Discourse…

También puedes consultar este recurso:

Personalmente, soy un gran fanático del estilo de enrutamiento de Stack Overflow para usuarios:

https://stackoverflow.com/users/17174/sam-saffron

En el mundo de Discourse, esto sería:

https://meta.discourse.org/u/17174/sam-saffron

Esto te permite tener lo mejor de ambos mundos. Pero sí, entiendo perfectamente la objeción: “No me gusta que el 17174 aparezca en ninguna parte de la URL; los nombres de usuario son estables”.

Dicho esto, hemos sobrevivido hasta ahora con nuestras rutas actuales; simplemente, de vez en cuando surgen algunos casos extremos.

5 Me gusta

Creo que sería útil utilizar el ID en lugar del nombre de usuario (o ambos, pero dependiendo únicamente del ID, como se explicó anteriormente) al menos en la página de perfil del usuario, para que el administrador pueda cambiar el nombre de usuario mediante la interfaz de Discourse sin necesidad de ejecutar el comando en la consola de Rails si algo sale mal con el nombre de usuario.

Solo debemos preocuparnos por los caracteres donde la implementación de JavaScript y Ruby de la conversión a minúsculas difiere. No al revés.

No hay una regla sobre cómo se convierte la letra minúscula alemana “ß” a mayúscula. Podría ser “SS”, “SZ” o incluso la nueva letra mayúscula “ẞ” (sí, hay una diferencia sutil). Revertir ese proceso solo es posible para “ẞ” y eso funciona correctamente en Ruby y JavaScript.


Creo que deberíamos hacer lo siguiente:

  1. Fusionar la solución temporal de @sam para solucionar el problema inmediato.
  2. Eliminar LOWER(username) de las consultas SQL, porque es simplemente una mala práctica (por ejemplo, falta de normalización Unicode).
  3. Esperar a que Ruby solucione el problema subyacente.
  4. A largo plazo: Pensar en agregar IDs de usuario a las rutas. Supongo que la parte más difícil será averiguar cómo manejar las comillas y las menciones.
3 Me gusta

No estoy seguro de si está relacionado, pero tenemos varios usuarios con nombres unicode y estos están dispersos en /log

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"users", :username=>"ζηεδψ"}, possible unmatched constraints: [:username])