【问题标题】:Rails 3 + action mailer - Cannot loop to send emailsRails 3 + action mailer - 无法循环发送电子邮件
【发布时间】:2011-07-14 21:05:12
【问题描述】:

一个用户可以创建一个对象,并且他有关注者,我想在他创建这个对象时提醒他。

控制者:

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" <beatrix@example.com>',
            :subject => "#{project.owner.name} created a new project")
    end
end

使用有 2 个关注者的用户进行测试:
User.find(1).followers.count = 2

Follower.follower 是关注用户的id

仅向第一个关注者发送了 1 封电子邮件,而第二个则没有收到任何内容 - 怎么了?

[已解决] => .deliver 方法根本不支持多条消息。谢谢DR

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案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" <beatrix@example.com>',
             :subject => "#{project.owner.name} created a new project")
    end
    

    【讨论】:

    • 太好了,工作正常 --- 不知道 deliver 方法不支持多条消息 --- 非常感谢!
    • 作为备忘录,将邮件程序视为控制器和将邮件方法视为呈现视图是值得考虑的。控制器只能渲染一次。
    【解决方案2】:

    您还可以将 .deliver 调用移动到您的 new_project 方法中。这适用于我使用 Rails 3:

    def new_project(project)
      # ...
      @followers.each do |f|
        # ...
        mail(:to => @u.email,
             :from => '"Beatrix Kiddo" <beatrix@example.com>',
             :subject => "#{project.owner.name} created a new project").deliver
      end
    end
    

    要发送邮件,您可以使用

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

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 2015-08-23
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2015-09-08
      • 2011-05-15
      相关资源
      最近更新 更多