2014-01-16 75 views
4

我无法让Rails一次向多个用户发送电子邮件。我正在尝试向通过我的网站注册的多个场馆发送通知,以便与其匹配的查询得到批准。Rails Actionmailer发送多个收件人

待处理的查询必须由管理员批准。邮件程序通过@ enquiry,即电子邮件被触发时。这里展示在我的询问控制器:

def approve 
    @enquiry.approve 
    redirect_to [:admin, @enquiry], notice: 'Enquiry is approved.' 
    SupplierMailer.new_enquiry(@enquiry).deliver 
end 

在我Supplier_mailer.rb,我有这样的方法:

def new_enquiry(enquiry) 
     @enquiry = enquiry 
     @enquiry.venues.each do |venue| 
     mail(to: venue.supplier.user.email, subject: 'You have a new enquiry') 
    end 
    end 

目前,它仅发送给1个电子邮件地址,因此无法正常循环。

型号:

enquiry 
has_and_belongs_to_many :venues 

supplier 
has_many :venues 
has_one :user 

我做了什么错?

感谢

回答

9

new_enquiry方法应该是建立一个电子邮件,然后将其与正在方法deliver发送。该循环正常工作,但是每次调用邮件时,都会覆盖之前的调用,并且该方法会返回最后一次调用。

相反,先得到收件人列表,并把它作为一个to属性

emails = @enquiry.venues.map {|venue| venue.supplier.user.email} 
mail(to: emails, subject: 'You have a new enquiry') 

如果你不快乐与发送其它邮件给对方,则需要在循环内的地方梅勒行动:

def approve 
    @enquiry.approve 
    redirect_to [:admin, @enquiry], notice: 'Enquiry is approved.' 
    @enquiry.venues.each do |venue| 
    SupplierMailer.new_enquiry(@enquiry, venue).deliver 
    end 
end 

def new_enquiry(enquiry, venue) 
    @enquiry = enquiry 
    mail(to: venue.supplier.user.email, subject: 'You have a new enquiry') 
end 

最后一个选项是非常哈克,但提供了最好的接口:

class SupplierMailer << ActionMailer::Base 

    def self.new_enquiry(enquiry) 
    @enquiry = enquiry 
    mails = @enquiry.venues.map do |venue| 
     mail(to: venue.supplier.user.email, subject: 'You have a new enquiry') 
    end 
    class << mails 
     def deliver 
     each(&:deliver) 
     end 
    end 
    mails 
    end 
+0

非常好,谢谢。我用第二个选项,完美地工作。 –

+0

嗨,伙计们,我有类似的问题,并想问一个后续问题的解决方案。通过类别SupplierMailer代码,您是如何获得@ enquiry.venues.map do | venue |的值等...在模板上呈现。我有一个类似的设置,但我无法让我的text.erb文件正确渲染,因为数组内的变量不是实例变量,因此它们不会结转。你有没有遇到这个问题? –

相关问题