Rails 3 + action mailer-No se puede hacer bucle para enviar correos electrónicos


Un usuario puede crear un objeto, y tiene seguidores que quiero alertar cuando crea este objeto.

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

Prueba 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 2do no recibe nada - ¿qué está mal?

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

Author: Community, 2011-03-14

2 answers

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

Prueba 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 verse así:

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
 36
Author: Daniel Rikowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-07 09:18:05

También puede mover el .entregar llamada en 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, usarías

if @project.save
   # ...
   UserMailer.new_project(@project)
else
   # ...
end
 6
Author: Stefan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-05 08:13:33