2010-11-11 6 views
8

Ho una risorsa "Gruppi" all'interno della mia app che gli utenti possono unire (un Gruppo ha e_belongs_to_many Users e viceversa). Il plugin devise_invitable permette a un utente esistente sulla mia app di e-mail un invito ad un altro utente poetntial a registrarsi sul sito, ma voglio alcune funzionalità in più: voglio un utente sia in grado di invitare qualcuno a un particolare gruppo, in modo che non appena accettano quell'invito nell'e-mail, possono vedere un link per unirsi a quel Gruppo.Utilizzare devise_invitable per aggiungere utenti a un gruppo in Ruby on Rails?

Qualcuno ha mai usato devise_invitable per fare qualcosa del genere? Qual è il modo migliore per aggiungere questa funzionalità extra? Sembra che avrei bisogno di includere una sorta di "token di gruppo" che identifica il gruppo nell'e-mail di invito, quindi restituirlo nell'URL che l'utente fa clic per accettare l'invito.

Devo sovrascrivere i metodi del controller inviti o esiste un altro plug-in che funzioni meglio?

risposta

7

Ho appena implementato alcuni molto simili. Ho provato a usare devise_invitable ma era molto lavoro. Così ho cercato altri plugin ma non ho trovato nulla e ho concluso che era più semplice scrivere la mia implementazione. Questo è quello che ho fatto:

  • l'aggiunta di una risorsa invito,

  • quando un utente crea un invito devo conservare in un campo di invito (si tratta di un hash serializzata) tutte le informazioni che ho bisogno di applicare per l'utente che accetta l'invito

  • una e-mail viene inviata all'utente invitato, contiene un link come:?/utenti/iscrizione invitation_token = 1231223123

  • noi quando er clic sul collegamento Creo l'utente e applica tutte le informazioni memorizzate nell'invito come appartenenza al gruppo, nome, ruoli ...

  • se l'utente invitato non ha bisogno di registrarsi per il servizio rispetto al collegamento nel e-mail è diversa: gli inviti/123/accettano invitation_token = 12312312asdas324

Spero che questo aiuto

6

ho fatto questo sovrascrivendo il controller inviti, le istruzioni per fare questo sono nella pagina principale devise_invitable su? github quindi non entrerò qui.

Per motivi di sicurezza, ho creato una nuova tabella che contiene ulteriori informazioni sull'invio in modo che il link di accettazione dell'email non contenga il collegamento del gruppo (i miei gruppi sono solo su invito privato, quindi non voglio che un utente invitato modifichi l'invito url nell'email e potenzialmente aggiungere altri gruppi che non sono stati invitati).

La nuova tabella viene indicizzata da ID utente dopo devise_invitable crea nella tabella user.

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 

Poi, nel tuo metodo di aggiornamento (di nuovo nello stesso controllore) si può trovare() il record Inviti e tirare le informazioni richieste che vi permetterà di collegare il nuovo utente al gruppo.

L'unico problema che resta è come aggiungere ulteriori parametri per l'e-mail, come il nome del gruppo, che devo ancora risolvere.

+0

ottimo, grazie – overlox