2011-03-14 79 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