2011-03-14 76 views
22

用户可以创建一个对象,他有,我想,当他创建这个对象,以提醒追随者。的Rails 3 +行动邮件 - 无法循环发送电子邮件

控制器:

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 
    ... 

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" <[email protected]>', 
      :subject => "#{project.owner.name} created a new project") 
    end 
end 

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

Follower.followerid正在关注的用户。

只有1封电子邮件被发送到第一个跟随者,第二个没有收到任何东西 - 有什么不对?

[解决] =>此.deliver方法根本不支持多个消息。 THX DR

回答

35

的ActionMailer不支持与一个deliver电话发送多封邮件。 你必须移动回路中的new_project方法之外:

而不是

UserMailer.new_project(@project).deliver 

试试这个:

@followers = @project.owner.followers.all 
@followers.each do |f| 
    UserMailer.new_project(@project, f).deliver 
end 

然后new_project方法看起来是这样的:

def new_project(project, follower) 
    @u = User.find(f.follower) 
    mail(:to => @u.email, 
     :from => '"Beatrix Kiddo" <[email protected]>', 
     :subject => "#{project.owner.name} created a new project") 
end 
+0

大,工作得很好--- 不知道** **交付方法没有按不支持多个消息--- Thx非常多! – Laurent 2011-03-14 10:46:35

+2

作为备忘录这是值得我们思考的邮件程序作为控制器和邮件的方法呈现视图。控制器只能渲染一次。 – 2014-03-06 11:33:40

6

您还可以将.delive请拨打您的new_project方法。这工作我使用Rails 3:

def new_project(project) 
    # ... 
    @followers.each do |f| 
    # ... 
    mail(:to => @u.email, 
     :from => '"Beatrix Kiddo" <[email protected]>', 
     :subject => "#{project.owner.name} created a new project").deliver 
    end 
end 

要发送的邮件,你可以使用

if @project.save 
    # ... 
    UserMailer.new_project(@project) 
else 
    # ... 
end