Подтвердить что ты не робот

Rails 3 + action mailer - Не удается создать электронную почту

Пользователь может создать объект, и у него есть последователи, которых я хочу предупредить, когда он создает этот объект.

контроллер:

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 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 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.follower - это id пользователя, который следит за ним.

Только 1 письмо отправляется 1-му последователю, а второй ничего не получает - что не так?

[SOLVED] = > Метод .deliver просто не поддерживает несколько сообщений. спасибо DR

4b9b3361

Ответ 1

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

Ответ 2

Вы также можете переместить вызов .deliver в свой метод 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