将 current_user.id 传递给 actionmailer

Pass current_user.id into actionmailer

我正在尝试将 current_employer.id 传递到操作邮件程序中。所以我可以结束给属于雇主的用户的电子邮件。

我的邮件看起来像这样。

class ScheduleMailer < ActionMailer::Base

  default to: Proc.new { Employee.where(:employer_id => current_employer.id
       ).pluck(:email) },
       from: 'noreply@scheduled.com'



 def schedule_post_reg(employ)

 mail( :subject => "Your schedule has been posted.")

 end


 end

我收到这个错误

 NameError (undefined local variable or method `current_employer' for #<ScheduleMailer:0x0000010cec0880>):
  app/mailers/schedule_mailer.rb:3:in `block in <class:ScheduleMailer>'
  app/mailers/schedule_mailer.rb:10:in `schedule_post_reg'
  app/controllers/schedules_controller.rb:235:in `approve_shift'

任何关于如何传递 current_employer.id 而不是 actionmailer 的建议将不胜感激。

Mailer 无法直接访问请求上下文。原因是电子邮件不一定是 HTTP 请求的结果。例如,如果您从 CLI 传送电子邮件,则没有 HTTP 请求。

您需要将 employer 作为邮件程序的参数传递。

class ScheduleMailer < ActionMailer::Base

  default from: 'noreply@usescheduled.com'

  def schedule_post_reg(employee, employ)
    mail({
      :to => employee.email
      :subject => "Your schedule has been posted.")
    })
  end

end

如果您需要向不同的员工发送相同的电子邮件,给定一个雇主,您可以传递雇主并将所有电子邮件提取到 "to:" 字段中(但所有收件人都会看到所有其他电子邮件)

  def schedule_post_reg(employer, employ)
    mail({
      :to => Employee.where(:employer_id => employer.id).pluck(:email)
      :subject => "Your schedule has been posted.")
    })
  end

或使用bcc,或循环所有电子邮件并为每个员工电子邮件调用一次邮件程序,为每个员工生成不同的电子邮件。

在控制器中写这样的东西

@employer = Employer.find_by_id(params[:id])
ScheduleMailer.schedule_post_reg(employ, @employer).deliver

在邮件程序中

def schedule_post_reg(employ, employer)
    employees_emails = Employee.where(:employer_id => employer.id
   ).map(&:email).join(",")
    mail(:to => employees_emails, :subject => "Your schedule has been posted.")
end