2011-10-04 2 views
15

Estoy anulando el controlador devise_invitable y en mi método de creación me gustaría pasar valores adicionales a la plantilla de correo electrónico invitations_instructions. Por ejemplo, nombre de grupo, alguien ha tenido éxito en esto, de ser así, por favor dame algunas pistas aquí.pase vars de instancia adicionales a devise_invitable plantilla de correo electrónico

lo que he intentado ...

mi @group en mi Users::InvitesController < Devise::InvitationsController método de crear no está definida en la plantilla de correo electrónico.

intentado añadir :skip_invitation => true en mi crear y luego enviar el correo electrónico de forma manual como ...

self.resource = resource_class.invite!(params[resource_name], current_inviter, :skip_invitation => true) 
::Devise.mailer.invitation_instructions(self.resource).deliver 

pero esto le da un número incorrecto de argumentos por lo que no es algo que yo no estoy leyendo correctamente de la documentación.

ACTUALIZACIÓN - posible solución

La única manera parece ser esto, pero tengo curiosidad si hay una manera mejor que utiliza las plantillas e idear anuncio publicitario

en mis /app/controller/users/InvitesController#create (hereda de InvitationsController)

self.resource = resource_class.invite!(params[resource_name], current_inviter) do |u| 
    u.skip_invitation = true 
end 
UserMailer.invitation_instructions(self.resource, current_inviter, @object).deliver 

donde UserMailer es mi general (estándar) anuncio publicitario de la acción y es algo como ...

def invitation_instructions(resource, inviter, object) 
    @resource = resource 
    @object = object 
    @inviter = inviter 

    mail(:to => resource.email, :subject => 'New invitation from ' + inviter.first_name) 
    end 
+2

Su solución ofrecida en la actualización funciona. Pero no se siente muy limpio. También disfrutaría de una solución más limpia. Una forma podría ser parchear devise_invitable y redefinir 'invitar!' Para aceptar más opciones. – Guillaume

+1

@ andrew-lak Por favor extraiga su actualización en respuesta y acéptelo. –

Respuesta

2

Hay una forma más clara de lograr la solución que está buscando, y es usar Devise's own procedures for overriding mailer templates.

En primer lugar crear un anuncio publicitario personalizado que se extiende desde Devise::Mailer:

class MyMailer < Devise::Mailer 
    helper :application # gives access to all helpers defined within `application_helper`. 
    include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url` 
    default template_path: 'devise/mailer' # to make sure that your mailer uses the devise views 
end 

Luego, en config/initializers/devise.rb, establece config.mailer-"MyMailer". Esto le permitirá anular CUALQUIER correo electrónico que el dispositivo envíe y personalice a su gusto.

Entonces para usted, puede anular invitable_instructions así:

def invitation_instructions(record, token, opts={}) 
    # Determine a way to set object -- likely through a query of some type 
    @object = get_object_for(record) 

    opts[:subject] = 'New invitation from ' + inviter.first_name 

    super 
end 

El principal punto de fricción de su ejemplo estaba pasando en datos adicionales para establecer @group/@object. Para hacer eso, yo personalmente iría con algún tipo de consulta dentro del programa de correo (no está limpio, pero está encapsulado y, por lo tanto, es menos "mágico") para recuperar esos objetos.

Además, si desea utilizar plantillas personalizadas de correo electrónico en lugar de diseñar, simplemente puede agregarlas al directorio app/views/my_mailer/ y el dispositivo preferirá los correos electrónicos en ese directorio a través de los correos electrónicos de la gema.

Cuestiones relacionadas