2010-11-11 39 views
8

J'ai une ressource "Groupes" dans mon application que les utilisateurs peuvent rejoindre (un groupe a_et_s'impose à_plusieurs utilisateurs et vice versa). Le plugin devise_invitable permet à un utilisateur existant sur mon application d'envoyer par e-mail une invitation à un autre utilisateur à s'inscrire sur le site, mais je souhaite une fonctionnalité supplémentaire: Je souhaite qu'un utilisateur puisse inviter quelqu'un à un groupe particulier, afin que dès qu'ils acceptent cette invitation dans l'e-mail, ils peuvent voir un lien pour rejoindre ce groupe.Utiliser devise_invitable pour ajouter des utilisateurs à un groupe dans Ruby on Rails?

Est-ce que quelqu'un a utilisé devise_invitable pour faire quelque chose comme ça? Quelle est la meilleure façon d'ajouter ces fonctionnalités supplémentaires? Il me semble que je devrais inclure une sorte de "jeton de groupe" identifiant le groupe dans l'e-mail d'invitation, puis le renvoyer dans l'URL sur laquelle l'utilisateur clique pour accepter l'invitation. Dois-je substituer les méthodes du contrôleur d'invitations, ou existe-t-il un autre plugin qui sert mieux le but?

Répondre

7

Je viens d'en mettre en place des très similaires. J'ai essayé d'utiliser devise_invitable mais c'était beaucoup de travail. J'ai donc cherché d'autres plugins mais je n'ai rien trouvé et j'ai conclu qu'il était plus facile d'écrire ma propre implémentation. Voici ce que je faisais:

  • ajouter une ressource d'invitation,

  • lorsqu'un utilisateur crée une invitation que je stocke dans un champ d'invitation (c'est un hachage sérialisé) toutes les informations que je dois appliquer à l'utilisateur qui accepte l'invitation

  • un email est envoyé à l'utilisateur invité, il contient un lien comme:/utilisateurs/inscription invitation_token = 1231223123

  • lorsque nous clique sur le lien Je crée l'utilisateur et applique toutes les informations stockées dans l'invitation comme l'appartenance à un groupe, le nom, les rôles ...

  • si l'utilisateur invité ne doit pas s'inscrire pour le service que le lien dans le e-mail est différent: invitations/123/acceptent invitation_token = 12312312asdas324

Hope this aide

6

Je l'ai fait en remplaçant le contrôleur invite, les instructions pour le faire sont dans la page principale devise_invitable sur? github donc je ne vais pas y aller ici. Pour des raisons de sécurité, j'ai créé une nouvelle table contenant des informations d'invitation supplémentaires afin que le lien d'acceptation de courrier électronique ne contienne pas le lien de groupe (mes groupes sont réservés uniquement aux invitations privées). url dans l'email et éventuellement ajouter d'autres groupes auxquels ils n'ont pas été invités).

La nouvelle table est indexée par l'ID utilisateur après que devise_invitable l'ait créée dans la table utilisateur.

class Users::InvitesController < Devise::InvitationsController 
. 
. 
def create 

    # make sure the current user is connected to this object for security 
    if @object.has_connection_with(current_user) 

     # perform the invite  
     self.resource = resource_class.invite!(params[resource_name], current_inviter) 

     #since we invite based on object, we must reference this object once the user accepts, so we store this in our Invites table 
     object_invite = Invite.new(:invitable_type => @object.class.name, :invitable_id => @object.id, :user_id => self.resource.id, :inviter_id => current_inviter.profile.id) 
     object_invite.save! 

     if resource.errors.empty? 
     set_flash_message :notice, :send_instructions, :email => self.resource.email 
     #respond_with resource, :location => after_invite_path_for(resource) 
     render :json => {:status => 'success'} and return 
     else 
     respond_with_navigational(resource) { render_with_scope :new } 
     end 
    end 
    end 

Ensuite, dans votre méthode de mise à jour (encore une fois dans le même contrôleur), vous pouvez trouver() le dossier de invitations et tirer les informations nécessaires qui vous permettra de connecter le nouvel utilisateur au groupe.

Le seul problème restant est de savoir comment ajouter des paramètres supplémentaires à l'email, comme le nom du groupe, que je n'ai pas encore résolu.

+0

super, merci – overlox