我在 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/