Come si potrebbe implementare questo tipo di impegno graduale / registrazione pigro in Rails?
-
06-09-2019 - |
Domanda
Molto tempo fa mi sono imbattuto in un sito web (io purtroppo perso l'indirizzo, è stato una sorta di sito di giornale) che vi ha permesso di fare uso di tutto come se tu fossi un utente registrato. Si potrebbe valutare, preferita e commentare gli articoli, e quando avete fatto sarebbe visualizzare un, messaggio discreto incorporato dicendo che doveva registrarsi al sito per i vostri contributi siano salvati. Poi ha avuto il link per voi a vedere come il vostro profilo potrebbe apparire come se l'avete fatto, e sono rimasto sorpreso di vedere che aveva tutta la mia attività di lì; gli articoli che ho letto e salvato, commenti, ecc ho lasciato il sito e quando sono tornato in un secondo momento solo per curiosità, aveva ancora la mia attività salvato.
Ho pensato che fosse la cosa più grande mai, e ora che io sono nel processo di costruzione di un sito web con caratteristiche sociali, vorrei prendere questo approccio pure. Ma io sono ancora praticamente un noob e così non ho molta idea di come andare a questo proposito. Come lo faresti?
Soluzione
Vorrei creare un modello Profile
che viene creata automaticamente per ogni utente che visita il tuo sito e aggiunge il primo favorito, tempi la prima voce, ecc Profile
deve essere salvato al database tra cui una stringa opportunamente casuale e unica. Questa stringa può essere memorizzato come un cookie sul lato client, e verrà utilizzato in seguito per recuperare il tuo profilo. Dovrebbe essere casuale e abbastanza a lungo in modo che non si può facilmente manipolare il cookie e ottenere profili di altre persone anonime, ma questo non è del tutto evitabile (quindi attenzione si memorizzano i dati sensibili nei profili anonimi!).
Una volta che un utente si registra, è possibile associare il loro Profile
con il loro nuovo record di User
e rimuovere il cookie e l'identificatore stringa univoca. È ora possibile semplicemente recuperare i loro profili, quando il log-in, in base alla loro record User
.
Il modello Profile
può contenere tutte le informazioni che si desidera memorizzare.
Se si vuole distinguere tra gli utenti registrati e gli utenti anonimi, è possibile creare un modello AnonymousProfile
e un modello Profile
(ciascuno con differenti attributi), e semplicemente copiare tutti i dati dal profilo anonimo al profilo utente quando qualcuno registra.
Aggiornamento:
In tutta l'applicazione si può decidere di utilizzare queste informazioni quando un utente è connesso Si potrebbe definire un before_filter
che afferra l'utente corrente, e solo se v'è un vero utente registrato, si usa i dati del profilo:.
class ApplicationController < ActionController::Base
before_filter :fetch_user_data
def fetch_user_data
@current_user = ... # Work your magic to get current user
end
private
def current_profile
@current_user and @current_user.profile # Use profile association
end
end
Da qualche parte in un'azione di controllo:
if current_profile
# Do stuff with current_profile
# Only available to registered users...
end
È possibile modificare in seguito la realizzazione di current_profile
se si cambia idea e si desidera profili anonimi hanno effetto per gli utenti anonimi.
Altri suggerimenti
L'unico modo per identificare gli utenti è quello di utilizzare i cookie. Quello che il sito si sta utilizzando è probabilmente facendo è:
Per un utente prima volta creare una voce nella tabella 'utenti' e aggiungerli al gruppo 'ospiti'. Salvare giù un cookie identificativo per la macchina degli utenti in modo da poterli guardare in alto più tardi.
Se l'utente decide di iscriversi è possibile compilare il resto della loro dettagli nella tabella utente (si potrebbe anche voler avere una tabella separata per i dati dell'utente e dettagli di registrazione come nome utente / password, ecc ...) e aggiungerli al gruppo di utenti registrati.
Il modo di gestire i gruppi può essere semplice come una bandiera nel database.
Questa è una domanda rotaie ...
Io probabilmente gestire la maggior parte di questo in un before_filter nel vostro application_controller.rb. I passi sarebbe qualcosa di simile:
if has_cookie
@user = lookup_user
else
@user = create_new_guest_user
end
Si potrebbe molto facilmente estendere uno dei quadri di autenticazione esistenti come acts_as_authenticated o spazio per fare questo.