2009-05-27 6 views
5

Il y a longtemps que je suis tombé sur un site Web (j'ai malheureusement perdu l'adresse, c'était une sorte de site de journal) qui vous permettait de faire usage de tout comme si vous étiez un utilisateur enregistré. Vous pourriez noter, préférer et commenter des articles, et quand vous l'avez fait, il afficherait un message discret et intégré indiquant que vous deviez vous enregistrer sur le site Web pour que vos contributions soient sauvegardées. Ensuite, il a eu le lien pour que vous voyiez comment votre profil ressemblerait si vous l'avez fait, et j'ai été surpris de voir qu'il y avait toute mon activité là-bas; les articles que j'ai lus et enregistrés, les commentaires, etc. J'ai quitté le site et quand je suis revenu plus tard par simple curiosité, mon activité était encore sauvée. Je pensais que c'était la meilleure chose à faire, et maintenant que je suis en train de construire un site web avec des fonctionnalités sociales, je voudrais aussi adopter cette approche. Mais je suis encore à peu près un noob et donc je n'ai pas beaucoup d'idée sur la façon de s'y prendre. Comment le feriez-vous?Comment pourrait-on implémenter ce type d'engagement progressif/paresseux dans Rails?

Répondre

8

Je voudrais créer un modèle Profile qui est automatiquement créé pour tout utilisateur qui visite votre site et ajoute le premier favori, taux le premier élément, etc. Profile doivent être enregistrées dans la base de données comprenant une chaîne convenablement aléatoire et unique . Cette chaîne peut être stockée sous forme de cookie côté client et sera utilisée ultérieurement pour récupérer votre profil. Il devrait être aléatoire et assez long pour que vous ne puissiez pas altérer facilement votre cookie et obtenir des profils d'autres personnes anonymes, mais ceci n'est pas entièrement évitable (attention donc vous ne stockez aucune donnée sensible dans des profils anonymes!).

Une fois qu'un utilisateur s'enregistre, vous pouvez associer son Profile à son nouvel enregistrement User et supprimer le cookie et l'identificateur de chaîne unique. Vous pouvez maintenant simplement récupérer leurs profils lorsqu'ils se connectent, en fonction de leur enregistrement User. Le modèle Profile peut contenir toutes les informations que vous souhaitez stocker.

Si vous voulez différencier les utilisateurs enregistrés et les utilisateurs anonymes, vous pouvez créer un modèle AnonymousProfile et un modèle Profile (chacun avec différents attributs) et simplement copier toutes les données du profil anonyme au profil de l'utilisateur lorsque quelqu'un enregistre .

Mise à jour: Tout au long de votre application, vous pouvez décider d'utiliser ces informations uniquement lorsqu'un utilisateur est connecté Vous pouvez définir une before_filter qui saisit l'utilisateur actuel, et seulement s'il y a un utilisateur réel connecté, faire. vous utilisez les données de profil:

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 

Quelque part dans une action de contrôleur:

if current_profile 
    # Do stuff with current_profile 
    # Only available to registered users... 
end 

vous pouvez modifier ultérieurement la mise en œuvre de current_profile si vous changez d'avis et souhaitez que les profils anonymes aient un effet sur vos utilisateurs anonymes.

+0

Merci, ça a l'air bien. Mais que diriez-vous de ne pas appliquer l'activité sur le site jusqu'à ce que l'utilisateur soit enregistré? Désolé si c'est une question stupide, mais ce n'était pas évident pour moi de votre réponse. –

2

La seule façon d'identifier les utilisateurs est d'utiliser des cookies. Ce que le site que vous utilisiez est probablement le suivant:

Pour la première fois, créez une entrée dans la table 'users' et ajoutez-la au groupe 'guests'. Enregistrez un cookie d'identifiant sur la machine des utilisateurs afin de pouvoir les retrouver plus tard.Si l'utilisateur décide de s'inscrire, vous pouvez remplir le reste de ses détails dans la table utilisateur (vous pouvez même avoir un tableau séparé pour les détails de l'utilisateur et les détails d'inscription comme nom d'utilisateur/mot de passe etc ...) et ajouter les au groupe d'utilisateurs enregistrés.

La façon dont vous gérez vos groupes peut être aussi simple qu'un drapeau dans la base de données.

Comme il est question de rails ...

je ne serais probablement gérer la majeure partie de cela dans un before_filter dans votre application_controller.rb. Les étapes seraient quelque chose comme:

if has_cookie 
    @user = lookup_user 
else 
    @user = create_new_guest_user 
end 

Vous pouvez étendre très facilement l'un des cadres d'authentification existants comme acts_as_authenticated ou l'autorisation de le faire.

+0

Merci pour la réponse, cela semble très prometteur. Je ne suis pas très familier avec restful_authentication, par exemple, mais étant donné que la gestion des groupes peut être aussi simple qu'un drapeau dans la base de données, je suppose que je pourrais l'utiliser pour configurer les permissions empêchant l'enregistrement d'une activité Invité. droite? Je veux dire, ce serait quelque chose à faire dans la partie Rôles et autorisations de l'application/plugin, je suppose. –

+0

Pour être sauvé, je veux dire, pour avoir un impact réel sur le site Web. Par exemple, un vote n'est pas compté ou un commentaire n'apparaît pas réellement jusqu'à ce que l'utilisateur s'enregistre. –