2011-10-04 4 views
15

Je remplace le contrôleur devise_invitable et dans ma méthode de création, je souhaite transmettre des valeurs supplémentaires au modèle d'e-mail invitations_instructions. Par exemple, le nom du groupe, est-ce que quelqu'un a réussi à cela, si oui, s'il vous plaît donnez-moi quelques indices ici.transmettre des instances supplémentaires vars au modèle d'email de devise_invitable

ce que j'ai essayé ...

mon @group dans ma méthode Users::InvitesController < Devise::InvitationsController créer est pas défini dans le modèle de courrier électronique.

essayé d'ajouter :skip_invitation => true dans mon créer puis envoyer l'e-mail comme manuellement ...

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

mais cela donne le mauvais nombre d'arguments donc il y a quelque chose que je ne suis pas lire correctement à partir de la documentation.

MISE A JOUR - solution possible

La seule façon semble être, mais je suis curieux de savoir s'il y a une meilleure façon qui utilise les modèles fournis et concevoir mailer

dans mes /app/controller/users/InvitesController#create (Hérite 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 

UserMailer est mon action générale (standard) mailer et va quelque chose comme ...

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

Votre solution proposée dans la mise à jour fonctionne. Mais ce n'est pas très propre. J'apprécierais également une solution plus propre. Une solution pourrait être de patcher devise_invitable et de redéfinir 'inviter! 'Pour accepter plus d'options. – Guillaume

+1

@ andrew-lank s'il vous plaît extraire vous mettre à jour en réponse et l'accepter. –

Répondre

2

Il existe un moyen plus propre d'obtenir la solution que vous recherchez, à savoir Devise's own procedures for overriding mailer templates.

d'abord créer un logiciel de messagerie personnalisé qui va de 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 

Puis, en config/initializers/devise.rb, mis config.mailer-"MyMailer". Cela va vous permettre de remplacer n'importe quel e-mail que le dispositif envoie et personnalise à votre goût.

Alors pour vous, vous pouvez remplacer invitable_instructions comme ceci:

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 

Le principal point d'achoppement de votre exemple passait des données supplémentaires pour régler @group/@object. Pour ce faire, je voudrais personnellement aller avec un certain type de requête dans le mailer (pas propre, mais il est encapsulé et donc moins "magique") pour récupérer ces objets. En outre, si vous souhaitez utiliser des modèles d'e-mail personnalisés plutôt que des modèles, vous pouvez simplement les ajouter au répertoire app/views/my_mailer/ et concevoir préférera les e-mails de ce répertoire aux e-mails provenant de la gemme.

Questions connexes