ruby-on-rails - 在 Rails 中使用观察者模式时传递实例变量

标签 ruby-on-rails ruby design-patterns observer-pattern

我在 Rails 中使用观察者模式。 TestObserver 中的“delivered_email”方法将在通知邮件发出后被调用。如何将“通知”中的实例变量传递给“delivered_email”?我可以将它添加到标题或主题中。但这可能会带来安全问题,因为收到电子邮件的用户也可以看到该变量。有没有更好的办法解决?

class GeneralMailer < ActionMailer::Base
  def notification(data)
    @emails = data[:emails]
    subject = "#{@sender.to_s}"
    mail(:to => @emails, :subject => subject)
  end
end

class TestObserver
  def self.delivered_email(message)
    begin
      # do something here
      puts @emails
    rescue => ex
      # do something here
    end
  end

ActionMailer::Base.register_observer(TestObserver)

最佳答案

如果你确实想向邮件观察者发送扩展信息——就像我自己所做的——可以通过对你的邮件程序进行一些猴子修补来使用从 Mail::Message 扩展的自定义类来完成>.

请注意,这需要设置一个内部的、未记录的属性。在未来的 Rails 版本中,它可能无法继续工作。

class ExtendedMessage < Mail::Message
  attr_accessor :extra_args
end

class ApplicationMailer
  before_action :patch_message

  def patch_message
    # Patch the internal attribute @_message to use our overridden class
    # that you can store extra attributes inside.
    # NOTE: If a future Rails version decides to change the internals, this could break.
    @_message = ExtendedMessage.new
  end
end

class MailObserver
  def self.delivered_email(mail)
    do_something_with mail.extra_args
  end
end

关于ruby-on-rails - 在 Rails 中使用观察者模式时传递实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519918/

相关文章:

ruby-on-rails - 生成 422 错误的错误页面

ruby-on-rails - 目录 : integration test fail

ruby - 使用 String#end_with?() 但忽略大小写

c++ - 策略模式 C++

python - Python 中的单例模式

javascript - 默认选择值不显示在 vue 中

ruby-on-rails - 如何禁用active_admin 的批处理操作?

sql - 如何在 Rails 3/4 中批量运行更新?

Ruby:将整数转换为 32 位二进制数(或字符串)

javascript - reactjs 服务和表示组件拆分