在ActionMailer中设置实例变量

时间:2014-12-17 00:42:02

标签: ruby ruby-on-rails-3 ruby-on-rails-4 actionmailer instance-variables

我有大约30种邮件方法,我将用户作为参数传递。由于我需要访问视图中的@user变量,因此我必须在每个邮件程序方法中设置此实例变量,例如send_x_email(user)。

通常这会在初始化方法中完成,但我已经读过邮件程序的行为有点不同。另外,一些方法采用不同数量的参数(一个只接受用户,另一个接受用户和消息)。

我调查过before_action回调并查看了这篇文章

Setting instance variables in Action Mailer?

......但我仍然坚持。

我很感激有关如何简化事情的任何想法,并从邮件程序类中的30个左右的方法中删除@user = user。干杯!

class ReminderSender < ActionMailer::Base
  def send_commands_email(user)
    @user = user
    mail(to: @user.email,
         subject: "All Commands",
         from: "<commands@#{ENV['DOMAIN']}>")
  end

  def send_attachment_warning(user, message)
    @user = user
    @message = message
    mail(to: @user.email,
         subject: "Attachment Warning",
         from: "<attachments@#{ENV['DOMAIN']}>")
  end
end

1 个答案:

答案 0 :(得分:2)

尝试在类中定义'mail'方法并在那里声明一个实例变量,例如。

class YouMailer

  def send_email(user, message)
    subject = 'something'
    body = message

    mail(user, {subject: subject, body: body}})
  end

  def mail(user, options={})
    @user = user
    mail_options = {to: @user.email}.merge(options)

    super(mail_options)
  end
end

但您可能需要使用该策略指定'template_path'和'template_name'选项。

我的建议是保持现状。在所有邮件方法中使用“@user = user”是必要的并不坏。