In Ruby vedi ovunque cose come :name e ti chiedi perché non una stringa "name". La differenza è concreta.

"ciao".object_id   # => cambia ogni volta (nuovo oggetto)
"ciao".object_id
:ciao.object_id    # => sempre lo stesso
:ciao.object_id

Un symbol è immutabile e unico in memoria: esiste una sola istanza di :ciao in tutto il programma. Una string è mutabile e ogni letterale crea un nuovo oggetto.

Per questo i simboli sono perfetti come chiavi di hash e nomi/identificatori (user[:email], validates :name), mentre le stringhe servono per il testo che manipoli o mostri all'utente. Regola spannometrica: se è un'etichetta, usa un simbolo; se è contenuto, usa una stringa.