Rails 3 +动作邮件程序 - 无法循环发送电子邮件

Lau*_*ent 24 ruby-on-rails actionmailer

用户可以创建一个对象,并且他在创建此对象时有我想要提醒的关注者.

控制器:

if @project.save
  format.html { redirect_to(@project, :notice => 'Project was successfully created.') }
  format.xml  { render :xml => @project, :status => :created, :location => @project }
  # Send a notification to project owner's followers :
  UserMailer.new_project(@project).deliver
else
  ...
Run Code Online (Sandbox Code Playgroud)

user_mailer.rb:

def new_project(project)
    @url  = "http://localhost:3000/"
    @project = project
    # For each of project owner's follower, send an email notification
    @followers = project.owner.followers.all
    @followers.each do |f|
        @u = User.find(f.follower)
        mail(   :to => @u.email,
            :from => '"Beatrix Kiddo" <beatrix@example.com>',
            :subject => "#{project.owner.name} created a new project")
    end
end
Run Code Online (Sandbox Code Playgroud)

使用有2个关注者的用户进行测试:
User.find(1).followers.count = 2

Follower.followerid跟随的用户.

只有1封电子邮件发送给第一个粉丝,第二封邮件没有收到任何内容 - 出了什么问题?

[求助] =>该.deliver方法根本不支持多条消息.Thx DR

Dan*_*ski 37

ActionMailer不支持通过一次deliver调用发送多条消息.您必须将循环移到new_project方法之外:

代替

UserMailer.new_project(@project).deliver
Run Code Online (Sandbox Code Playgroud)

试试这个:

@followers = @project.owner.followers.all
@followers.each do |f|
    UserMailer.new_project(@project, f).deliver
end
Run Code Online (Sandbox Code Playgroud)

new_project然后该方法可能如下所示:

def new_project(project, follower)
    @u = User.find(f.follower)
    mail(:to => @u.email,
         :from => '"Beatrix Kiddo" <beatrix@example.com>',
         :subject => "#{project.owner.name} created a new project")
end
Run Code Online (Sandbox Code Playgroud)

  • 作为备忘录,值得考虑将邮件程序作为控制器,将邮件方法作为渲染视图.控制器只能渲染一次. (3认同)

小智 6

您还可以将.deliver调用移动到您的new_project方法中.这适用于我使用Rails 3:

def new_project(project)
  # ...
  @followers.each do |f|
    # ...
    mail(:to => @u.email,
         :from => '"Beatrix Kiddo" <beatrix@example.com>',
         :subject => "#{project.owner.name} created a new project").deliver
  end
end
Run Code Online (Sandbox Code Playgroud)

要发送邮件,您可以使用

if @project.save
   # ...
   UserMailer.new_project(@project)
else
   # ...
end
Run Code Online (Sandbox Code Playgroud)