Innanzitutto, grazie mille per il tuo aiuto! È comunque un bug interessante.
Il fatto è che potrei dover modificare il nome utente direttamente nel database, dato che la rotta non è disponibile
Puoi fornirmi una query?
Penso che non sia possibile, perché in tal caso bloccherei tutti i nomi che iniziano con Σ in Grecia (e di fatto interromperei gli accessi tramite Facebook per quegli utenti). Posso bloccare un pattern regex specifico? Così da assicurarmi che Σ sia almeno alla fine?
Un altro membro si è registrato con lo stesso identico problema. Il mio punto è che, per noi, questo non è un caso limite. Ci sono letteralmente migliaia di nomi in greco che usano la Σ (o ς) alla fine del nome.
E purtroppo, dato che il nostro gruppo di età principale è > 40 anni, molti membri hanno il nome scritto tutto in maiuscolo su Facebook (), quindi quando usano l’accesso con Facebook, il loro nome viene copiato nel campo nome utente…
Non ti preoccupare per Postgres. Dovremmo sempre confrontare con username_lower in SQL e non fare affidamento su LOWER(), perché username_lower non è semplicemente la versione in minuscolo del nome utente. Applichiamo anche la normalizzazione Unicode.
Sono d’accordo. Aggiungere una soluzione temporanea a User.normalize_username dovrebbe essere sufficiente per ora. Ci sono già state alcune discussioni nel bug di Ruby e sembra che non esista una soluzione semplice. Tuttavia, siamo fortunati, perché tutto ciò che dobbiamo fare è controllare l’ultimo carattere di un nome utente. È molto più semplice che farlo in una frase completa.
Giusto. Comunque, dovrebbe essere molto più semplice rispetto a un’implementazione completa, dato che dobbiamo preoccuparci solo di certi simboli come l’underscore, il trattino e forse i numeri? Dovrebbe essere fattibile.
So che mi sto allontanando dalla discussione specifica su questo bug, ma quando penso a questa problematica, non posso ignorare il fatto che si potrebbe evitare.
Ho scoperto che ci sono alcune rotte API in Discourse che fanno riferimento a un utente tramite userId, mentre altre lo fanno tramite username. Non dovrebbe esserci maggiore coerenza (a favore dell’userId)?
Forse si potrebbe implementare qualcosa di simile a quanto avviene ora con le categorie e i tag? Avere sia lo username che l’userId nell’URL, ad esempio: https://meta.discourse.org/u/chrispanag/4387
Nel 2016 @eviltrout era contrario, non so qual è la sua posizione attuale.
Comunque, ho una soluzione alternativa in Discourse in questa PR:
Gestirà il problema del nuovo accesso su Facebook convertendo in minuscolo qualsiasi nome utente che inizia con sigma. Ciò significa che tutto ciò che dovete fare è correggere il nome utente di Spiros e di qualsiasi altro utente con sigma finale convertendoli in minuscolo, e il problema dovrebbe risolversi definitivamente.
Ancora non amo usare gli ID ovunque, ma capisco che ci sono molti casi in cui ha senso.
In quei casi preferirei qualcosa come id-nomeutente, dove nomeutente è ciò che possiamo inserire in un URL. Potrebbe essere ignorato anche dal router. Ma almeno, quando condividi il link, avresti un’idea di cosa stai linkando.
Personalmente sono un grande sostenitore dello stile di routing di Stack Overflow per gli utenti:
https://stackoverflow.com/users/17174/sam-saffron
Nel mondo Discourse questo sarebbe:
https://meta.discourse.org/u/17174/sam-saffron
In questo modo ottieni il meglio da entrambi i mondi. Sì, capisco perfettamente l’obiezione: “Non mi piace avere 17174 da nessuna parte nell’URL, i nomi utente sono stabili”.
Detto questo, siamo sopravvissuti fino ad ora con le nostre rotte esistenti; è solo che ogni pochi anni emergono alcuni casi limite.
Credo che sarebbe utile utilizzare l’ID invece del nome utente (o entrambi, ma affidandosi esclusivamente all’ID, come spiegato sopra) almeno nella pagina del profilo utente, in modo che l’amministratore possa modificare il nome utente tramite l’interfaccia di Discourse senza dover eseguire il comando nella console di Rails, nel caso in cui si verifichi un problema con il nome utente.
Dobbiamo preoccuparci solo dei caratteri in cui l’implementazione della conversione in minuscolo di JavaScript e Ruby differisce. Non il contrario.
Non esiste una regola fissa su come la lettera minuscola tedesca “ß” venga convertita in maiuscolo. Potrebbe diventare “SS”, “SZ” o addirittura la nuova lettera maiuscola “ẞ” (sì, c’è una sottile differenza). Invertire questo processo è possibile solo per “ẞ” e funziona correttamente sia in Ruby che in JavaScript.
Penso che dovremmo fare quanto segue:
Unire la soluzione temporanea di @sam per risolvere il problema immediato
Rimuovere LOWER(username) dalle query SQL, perché è semplicemente una cosa sbagliata da fare (ad esempio, manca la normalizzazione Unicode)
Sperare che Ruby risolva il problema alla radice
A lungo termine: valutare l’aggiunta degli ID utente alle route. Immagino che la parte più difficile sarà capire come gestire le virgolette e i menzioni.