2009-09-05 12 views
1

J'essaie de comprendre ce que je fais mal avec ActionMailer. Je dois pouvoir passer plus d'un argument à un expéditeur mais continuer à recevoir l'erreur "mauvais nombre d'arguments (1 pour 2)".Actionmailer passant plus d'un argument

Mon code est: soldier_controller

def create 
    @soldier = Soldier.new(params[:soldier]) 
    @battalion = Battalion.find(params[:battalion_id]) 
    @company = Company.find(params[:company_id]) 
    @frg = @company.users.find_by_position('FRG Leader') 
respond_to do |format| 
    if @soldier.save 
    flash[:notice] = 'Soldier was successfully created.' 
    format.html { redirect_to battalion_company_soldier_path(@battalion, @company, @soldier)} 
    format.xml { render :xml => @soldier, :status => :created, :location => @soldier } 
    else 
    format.html { render :action => "new" } 
    format.xml { render :xml => @soldier.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

soldier_mailer.rb:

class SoldierMailer < ActionMailer::Base 

def welcome_email(soldier, primary) 
    recipients soldier.primary.email 
    from "[email protected]" 
    subject "Welcome to the Unit" 
    sent_on Time.now 
    body 
end 

soldier_observer.rb:

def after_create(soldier, primary) 
    SoldierMailer.deliver_welcome_email(soldier, primary) 
end 

Fondamentalement, je dois envoyer ce même courriel à plusieurs destinataires différents dont les adresses e-mail sont dans des modèles tous associés au modèle Soldier. Je n'ai aucun problème à envoyer un email à quand il n'y a qu'un seul paramètre dans la méthode. Si j'en ajoute plus d'un, il jette cette erreur.

J'apprécierais n'importe quelle aide ou conseil.

Merci.

+0

Pouvez-vous poster le texte intégral de l'exception et quelques lignes de la trace de la pile? –

Répondre

0

Essayez ceci:

class SoldierMailer < ActionMailer::Base 

    def welcome_email(soldier) 
    recipients soldier.email_addresses 
    from "[email protected]" 
    subject "Welcome to the Unit" 
    sent_on Time.now 
    end 
end 

Avec dans votre modèle de soldat: Je suppose qu'il est une association qui contient plus email adresses que vous souhaitez utiliser.

class Soldier 

    has_many :users 

    def email_address 
    # Results in ['[email protected]', '[email protected]', '[email protected]'.com] 
    ([primary] + users.collect { |u| u.email }).flatten 
    end 
end 

La clé est que les 'destinataires' dans ActionMailer peuvent prendre un tableau d'adresses email. J'espère que cela t'aides.

+0

super c'est une aide énorme! Merci beaucoup. –

0

Peut-être que je ne comprends pas totalement votre situation, mais y a-t-il quelque chose de mal à envoyer quelque chose de différent à votre méthode deliver_welcome_email? Peut-être que vous pourriez envoyer un tableau ou un hachage à la méthode avec vos multiples destinataires. À la lecture de la documentation sur les rails, il semble que ces méthodes d'envoi d'actions ne prennent qu'un seul argument.

Aussi je suis un peu confus au sujet de la raison pour laquelle vous devez envoyer ces deux paramètres à votre expéditeur. Il semble que vous n'utilisiez que soldier.

2

La méthode after_create ne peut prendre en paramètre qu'un modèle. si primaire est un champ de soldat, vous devez faire quelque chose comme

def after_create(soldier) 
    SoldierMailer.deliver_welcome_email(soldier, soldier.primary) 
end