【问题标题】:Emailing multiple users using ActionMailer使用 ActionMailer 向多个用户发送电子邮件
【发布时间】:2012-02-22 04:17:50
【问题描述】:

这完全是一个新手问题,但我想知道是否有人可以协助设置邮件程序。我有一个模型“用户”并在其下方嵌套了一个“联系人”模型(具有 has_many/belongs_to 关系)。

我现在正在尝试创建一个邮件程序,该邮件程序将由用户页面上的特定操作(创建帖子)触发,并将通过电子邮件发送属于该用户的所有联系人。但我无法破解邮件所需的语法——我尝试将收件人设置为@user.contacts.all,并尝试像使用this solution 一样遍历它们。任何人都可以建议最干净的方法吗?

这是我目前的代码:

Posts controller:

  after_create :send_contact_email

  private

  def send_contact_email
    ContactMailer.contact_email(self).deliver
  end

contact_mailer(这是我最近的尝试,取自 RoR 网站 - 我怀疑这不是最好的方法......)

class ContactMailer < ActionMailer::Base 

  def contact_email(user)
    recipients    @user.contacts.all
    from          "My Awesome Site Notifications <notifications@example.com>"
    subject       "Welcome to My Awesome Site"
    sent_on       Time.now
    body          {}
  end
end

然后是contact_email.html.erb的基本消息。

当前错误是:

UsersController#create_post 中的 NoMethodError

nil:NilClass 的未定义方法 `contacts'。

您能提供的任何建议都将非常感激!

* 更新 *

按照 Baldrick 的建议,contact_email 方法现在是:

class ContactMailer < ActionMailer::Base 
  default :to => Contact.all.map(&:contact_email),
          :from => "notification@example.com"

  def contact_email(user)
    @user = user
    mail(:subject => "Post added")
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 actionmailer


    【解决方案1】:

    有一个错字:您在 contact_email 方法中使用的是 @user 而不是 user。 它可能不是唯一的问题,但至少它是错误消息"undefined method 'contacts' for nil:NilClass "的原因@

    更新

    因此,使用正确的语法,从默认选项中删除 :to,并将其设置为 contact_email 方法,以及用户的联系人:

    class ContactMailer < ActionMailer::Base 
      default :from => "notification@example.com"
    
      def contact_email(user)
        @user = user
        mail(:subject => "Post added", :to => user.contacts.map(&:contact_email),)
      end
    end
    

    【讨论】:

    • 即使将其更改为recipients user.contacts.all 我仍然收到相同的消息,恐怕:-(
    • 所以user 的值可能也为零...不过,您的方法contact_email 在语法上不正确,我看不出您要做什么。看看guides.rubyonrails.org/action_mailer_basics.html中的例子对你有帮助
    • 谢谢 - 原来我使用的是旧版本的 rails 文档。使用正确的语法(在上面添加),我现在可以成功地通过电子邮件发送contact_email 方法——不幸的是,它会发送给数据库中的所有联系人,无论他们是否属于我正在添加帖子的用户。同样,更改为 :to =&gt; User.contact.all.map(&amp;:contact_email), 似乎不起作用...
    • 我已经编辑了我的答案,您需要将:to =&gt; 选项移动到contact_email 方法
    • 感谢 Baldrick - 您的新代码可以工作并发送电子邮件,但它仍然包含属于其他用户的联系人:-(
    【解决方案2】:
    class ContactMailer < ActionMailer::Base 
      default :to => Contact.all.map(&:contact_email),
              :from => "notification@example.com"
    
      def contact_email(user)
        recipients = user.contacts.collect(&:contact_email).join(',')
        mail(:subject => "Post added", :to => recipients)
      end
    end
    

    【讨论】:

    • 嗨 Sandip - 感谢您的回答,但使用此代码我仍然收到错误 undefined method 'contacts' for #&lt;Class:0x105339748&gt; - 我也应该在这里声明联系人吗?
    • 你没有用户 has_many :contacts 关联在用户模型中定义吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2021-11-28
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多