2011-10-04 5 views
15

Sto ignorando il controller devise_invitable e nel mio metodo di creazione vorrei passare valori aggiuntivi al modello di email invitations_instructions. Per esempio il nome del gruppo, qualcuno ha avuto successo con questo, in tal caso per favore dammi qualche indizio qui.passa le var di istanze extra a devise_invitable modello di posta elettronica

quello che ho provato ...

mia @group nel mio Users::InvitesController < Devise::InvitationsController metodo create non è definito nel modello di e-mail.

provato ad aggiungere :skip_invitation => true nella mia creare e quindi inviare l'e-mail manualmente come ...

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

ma questo dà il numero errato di argomenti per cui v'è qualcosa che non sto leggendo correttamente dalla documentazione.

AGGIORNAMENTO - possibile soluzione

L'unico modo sembra essere questo, ma io sono curioso di sapere se c'è un modo migliore che utilizza i modelli forniti e elaborare mailer

nei miei /app/controller/users/InvitesController#create (eredita da 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 

dove UserMailer è il mio generale (standard) mailer azione e va qualcosa di simile ...

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

La soluzione offerta nell'aggiornamento funziona. Ma non sembra molto pulito. Mi piacerebbe anche una soluzione più pulita. Un modo potrebbe essere quello di applicare devise_invitable e ridefinire 'invite!' Per accettare più opzioni. – Guillaume

+1

@ andrew-lank si prega di estrarre l'aggiornamento in risposta e accettarlo. –

risposta

2

C'è un modo più pulito per ottenere la soluzione che stai cercando, e cioè usare Devise's own procedures for overriding mailer templates.

Innanzitutto creare un mailer personalizzato che si estende da 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 

Poi, nel config/initializers/devise.rb, impostare config.mailer-"MyMailer". Ciò ti consentirà di ignorare QUALSIASI email che escogita invia e personalizzi a tuo piacimento.

Quindi per voi, è possibile ignorare invitable_instructions in questo modo:

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 

Il punto critico principale dal vostro esempio stava passando nei dati aggiuntivi per impostare @group/@object. Per fare ciò, personalmente andrei con qualche tipo di query all'interno del mailer (non pulito, ma è incapsulato e quindi meno "magico") per recuperare quegli oggetti.

Inoltre, se si desidera utilizzare modelli di e-mail personalizzati anziché quelli di Devise, è possibile aggiungerli semplicemente alla directory app/views/my_mailer/ e elaborare preferirà le e-mail in tale directory tramite le e-mail dalla gemma.