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
Ответы
Ответ 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