¡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
¿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.
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 (), por lo que cuando usan el inicio de sesión con Facebook, su nombre se copia en el campo de nombre de usuario…
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.
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.
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.
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.
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.
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.
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:
Fusionar la solución temporal de @sam para solucionar el problema inmediato.
Eliminar LOWER(username) de las consultas SQL, porque es simplemente una mala práctica (por ejemplo, falta de normalización Unicode).
Esperar a que Ruby solucione el problema subyacente.
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.