2011-03-14 13 views
22

Un usuario puede crear un objeto y tiene seguidores a los que quiero alertar cuando crea este objeto.Envío de cartas Rails 3 + action - No se puede enviar un bucle para enviar correos electrónicos

controlador:

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 

Testing con un usuario que tiene 2 seguidores:
User.find(1).followers.count = 2

Follower.follower es el id del usuario que está siguiendo.

Solo se envía 1 correo electrónico al 1er seguidor, y el 2º no recibe nada, ¿qué ocurre?

[SOLUCIONADO] => el método .deliver simplemente no admite varios mensajes. Thx DR

Respuesta

35

ActionMailer no admite el envío de varios mensajes con una llamada deliver. Tienes que mover el bucle fuera del método new_project:

En lugar de

UserMailer.new_project(@project).deliver 

intente esto:

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

El método new_project entonces podría tener este aspecto:

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

Grande, que trabaja muy bien --- no conocía el ** ** entregar método doesn Soporta múltiples mensajes --- ¡Demasiado! – Laurent

+2

Como aide memoire, vale la pena pensar en publicistas como controladores y en el método de correo como visualización. Los controladores solo pueden renderizar una vez. –

6

También puede mover el .delive Llame a su método new_project. Esto funciona para mí usando 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 

Para enviar los correos, se usaría

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