Actionmailer передает более одного аргумента

Я пытаюсь понять, что я делаю не так с ActionMailer. Мне нужно иметь возможность передавать более одного аргумента почтовой программе, но продолжать получать ошибку "неправильное количество аргументов (1 вместо 2)".

Мой код: солдат_контроллер

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

Солдат_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

солдат_наблюдатель.rb:

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

По сути, мне нужно отправить одно и то же электронное письмо нескольким разным получателям, чьи адреса электронной почты находятся в моделях, связанных с моделью солдата. У меня нет проблем с отправкой электронного письма, когда в методе есть только один параметр. Если я добавлю более одного, он выдает эту ошибку.

Буду признателен за любую помощь или руководство.

Спасибо.


person Community    schedule 05.09.2009    source источник
comment
Можете ли вы опубликовать полный текст исключения и несколько строк трассировки стека?   -  person Andy Gaskell    schedule 06.09.2009


Ответы (3)


Попробуй это:

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

С этим в вашей модели солдата: я предполагаю, что есть ассоциация, которая содержит больше адресов электронной почты, которые вы хотите использовать.

class Soldier

  has_many :users

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

Суть в том, что «получатели» в ActionMailer могут принимать массив адресов электронной почты. Надеюсь это поможет.

person Ariejan    schedule 07.09.2009

Метод after_create может принимать только модель в качестве параметра. если первичным является поле солдата, вы должны сделать что-то вроде

def after_create(soldier)
  SoldierMailer.deliver_welcome_email(soldier, soldier.primary) 
end
person ez.    schedule 05.09.2009

Может быть, я не совсем понимаю ваше затруднительное положение, но есть ли что-то неправильное в том, что вы просто отправляете что-то другое на ваш метод deliver_welcome_email?

Возможно, вы могли бы отправить массив или хэш методу с несколькими получателями. Из чтения документации по рельсам кажется, что эти методы рассылки действий принимают только один аргумент.

Также я немного смущен тем, почему вам нужно отправить оба этих параметра в вашу почтовую программу. Похоже, вы использовали только soldier.

person Community    schedule 05.09.2009