如何向所有属性为 true 的用户发送电子邮件 (Rails Mailer)

How to send email to all users who have an attribute as true (Rails Mailer)

我正在尝试向所有在注册时留下 "subscribe to newsletter" 检查的用户发送电子邮件通讯。 "Subscribed" 是 "Users" 的布尔属性,我想用它来完成此操作。

到目前为止我有以下内容。

错误:

undefined method `subscribed?' for #<Array:0x007f37ba707828>
        mail to: User.pluck(:email).subscribed?

在我的邮件中:

class Monthly_Mailer < ApplicationMailer
    def monthly(newsletter)
        @newsletter = newsletter
        mail to: User.pluck(:email).subscribed?
    end
end

我试过去掉'?'并尝试在我的 users modelcontroller

中放置以下方法
def subscribed?
    true if self.subscribed == true
end

当然,我在controller里把self改成了@user,然后id选择了@user

如果我需要 post 附加代码,请告诉我。我只是想知道实现此目标的最佳方法,并不一定执着于这种方法。

提前感谢您的意见。

编辑:添加错误

NoMethodError in NewslettersController#send_newsletter undefined method `ascii_only?' for 1:Fixnum

Monthly_Mailer.monthly(@newsletter).deliver_now

Started GET "/send_newsletter?id=1" for 127.0.0.1 at 2015-07-07 11:30:20 -0400
Started GET "/send_newsletter?id=1" for 127.0.0.1 at 2015-07-07 11:30:20 -0400
Processing by NewslettersController#send_newsletter as HTML
Processing by NewslettersController#send_newsletter as HTML
  Parameters: {"id"=>"1"}
  Parameters: {"id"=>"1"}
  Newsletter Load (0.2ms)  SELECT  "newsletters".* FROM "newsletters" WHERE "newsletters"."id" =  LIMIT 1  [["id", 1]]
  Newsletter Load (0.2ms)  SELECT  "newsletters".* FROM "newsletters" WHERE "newsletters"."id" =  LIMIT 1  [["id", 1]]
   (0.2ms)  SELECT "users"."id" FROM "users" WHERE "users"."subscribed" = 't'
   (0.2ms)  SELECT "users"."id" FROM "users" WHERE "users"."subscribed" = 't'
  Rendered monthly_mailer/monthly.html.erb within layouts/mailer (0.3ms)
  Rendered monthly_mailer/monthly.html.erb within layouts/mailer (0.3ms)

Monthly_Mailer#monthly: processed outbound mail in 5.4ms

Monthly_Mailer#monthly: processed outbound mail in 5.4ms

Sent mail to  (0.5ms)

Sent mail to  (0.5ms)


Completed 500 Internal Server Error in 8ms (ActiveRecord: 0.4ms)
Completed 500 Internal Server Error in 8ms (ActiveRecord: 0.4ms)

NoMethodError (undefined method `ascii_only?' for 1:Fixnum):
  app/controllers/newsletters_controller.rb:8:in `send_newsletter'



NoMethodError (undefined method `ascii_only?' for 1:Fixnum):
  app/controllers/newsletters_controller.rb:8:in `send_newsletter'

好的,如果你想使用 pluck: mail to: User.where(activated: true).pluck(:email)

为了更好的代码使用范围而不是 where(activated: true)

#user.rb scope :activated, -> { where(activated: true) }

然后 mail to: User.activated.pluck(:email)

首先你错了什么:

1) 在您的邮寄操作中,您正在收集用户的电子邮件,最终会 return 您收到一系列电子邮件,然后链接一个 subscribed? 函数您在用户 class 中定义的。所以,必然会报错。

User.pluck(:email).subscribed?

解决方案:

1) 在用户模型中定义一个函数,如:

def self.subscribed_users
  User.where(subscribed: true).pluck(:email)
end

2) 在你的邮件程序中,你可以这样调用:

def monthly(newsletter)
        @newsletter = newsletter
        mail to: User.subscribed_users
end

如果您想向 to 字段中的所有订阅者或您的订阅者发送 1 封电子邮件,请使用此选项。

mail(to: User.where(subscribed: true).pluck(:email))

如果您希望每个订阅者都有单独的电子邮件,请使用此选项

User.where(subscribed: true).pluck(:email).each do |email|
  mail(to: email)
end

您收到 ascii_only? 错误的原因是因为@user3683877 的答案传递的是一组 ID 而不是电子邮件地址。

根据 http://guides.rubyonrails.org/action_mailer_basics.html(第 2.3.3 节向多个收件人发送电子邮件)

电子邮件列表可以是电子邮件地址数组或地址以逗号分隔的单个字符串。

1) 在用户模型中定义一个函数,如:

def self.subscribed_users
  User.where(subscribed: true)
end

2) 在你的邮件中,你应该这样做,

def monthly(newsletter)
    @newsletter = newsletter
    mail to: User.subscribed_users.pluck(:email)
    # uncomment the below line and comment above line to get comma separated emails
    # mail to: User.subscribed_users.collect(&:email).join(',')
end