Ruby on rails 在rails中使用观察者模式时传递实例变量
我在rails中使用观察者模式。发出通知电子邮件后,将调用TestObserver中的“delivered_email”方法。如何将“通知”中的实例变量传递给“已发送的电子邮件”?我可以在标题或主题中添加它。但这可能会带来安全问题,因为收到电子邮件的用户也可以看到该变量。有没有更好的办法解决这个问题Ruby on rails 在rails中使用观察者模式时传递实例变量,ruby-on-rails,ruby,design-patterns,observer-pattern,Ruby On Rails,Ruby,Design Patterns,Observer Pattern,我在rails中使用观察者模式。发出通知电子邮件后,将调用TestObserver中的“delivered_email”方法。如何将“通知”中的实例变量传递给“已发送的电子邮件”?我可以在标题或主题中添加它。但这可能会带来安全问题,因为收到电子邮件的用户也可以看到该变量。有没有更好的办法解决这个问题 class GeneralMailer < ActionMailer::Base def notification(data) @emails = data[:emails]
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)
class GeneralMail@emails,:subject=>subject)
结束
结束
类TestObserver
def自传电子邮件(信息)
开始
#在这里做点什么
发送@封电子邮件
救援=>ex
#在这里做点什么
结束
结束
ActionMailer::Base.register\u 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
class ExtendedMessage
实际目的是什么,为什么您的观察者需要在回调中为一条消息发送一堆电子邮件?目的是使用“通知”方法中定义的实例变量。这里我只举一个简单的例子来说明我的目的。我并不愚蠢——你在问题中已经说过了。除了将变量塞进消息中之外,似乎没有办法将变量传递给上午的观察者,正如您已经发现的那样,这是一个坏主意。因此,如果您分享了您实际试图对变量中的数据执行的操作,而不仅仅是您建议的解决方案“发送一个变量”。您是否可以将message.to
value?它似乎等于@电子邮件
?