2010-11-11 9 views
8

Tengo un recurso de "Grupos" dentro de mi aplicación al que los usuarios pueden unirse (un grupo tiene_y_belgos_para_muchos usuarios y viceversa). El complemento devise_invitable permite a un usuario existente en mi aplicación enviar por correo electrónico una invitación a otro usuario poético para que se registre en el sitio, pero quiero algunas funcionalidades adicionales: quiero que un usuario pueda invitar a alguien a un grupo particular, de modo que tan pronto como acepten esa invitación en el correo electrónico, pueden ver un enlace para unirse a ese grupo.¿Usando devise_invitable para agregar usuarios a un grupo en Ruby on Rails?

¿Alguien ha utilizado devise_invitable para hacer algo como esto? ¿Cuál es la mejor manera de agregar esta funcionalidad adicional? Parece que necesitaría incluir algún tipo de "token de grupo" que identifique al Grupo en el correo electrónico de invitación y luego volver a pasarlo a la URL en la que el usuario hace clic para aceptar la invitación.

¿Debo anular los métodos del controlador de invitaciones, o hay otro complemento que sirva mejor?

Respuesta

7

Acabo de implementar algunas muy similares. He intentado usar devise_invitable, pero fue por mucho trabajo. Así que busqué algunos otros complementos pero no pude encontrar nada y concluí que era más fácil escribir mi propia implementación. Esto es lo que hice:

  • añadiendo un recurso invitación,

  • cuando un usuario cree una invitación almaceno en un campo de invitación (que es un hash serializado) toda la información que necesito para aplicar al usuario que acepte la invitación

  • un correo electrónico se envía al usuario invitado, que contiene un enlace como:?/usuarios/registro invitation_token = 1231223123

  • nosotros cuando er clics en el enlace Creo el usuario y aplica toda la información almacenada en la invitación como membresía grupal, nombre, roles ...

  • si el usuario invitado no necesita inscribirse para el servicio que el enlace en el correo electrónico es diferente: invitaciones/123/aceptan invitation_token = 12312312asdas324

esperanza esta ayuda

6

he hecho esto reemplazando el controlador invita, las instrucciones para hacerlo se encuentran en la página principal de devise_invitable? Github, así que no entraré aquí.

Por seguridad, creé una nueva tabla que contiene información de invitación adicional para que el enlace de aceptación de correo electrónico no contenga el enlace de grupo (mis grupos son solo privados, por lo que no quiero que un usuario invitado modifique la invitación url en el correo electrónico y potencialmente agregar otros grupos que no fueron invitados).

La nueva tabla está indexada por la identificación del usuario después de que devise_invitable la cree en la tabla de usuarios.

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 

Luego, en el método de actualización (de nuevo en el mismo controlador) se puede encontrar() el registro invita y tirar de la información necesaria que le permitirá conectar el nuevo usuario al grupo.

El único problema que queda es cómo agregar parámetros adicionales al correo electrónico, como el nombre del grupo, que aún tengo que resolver.

+0

genial, gracias – overlox

Cuestiones relacionadas