Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails中使用观察者模式时传递实例变量_Ruby On Rails_Ruby_Design Patterns_Observer Pattern - Fatal编程技术网

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

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]

我在rails中使用观察者模式。发出通知电子邮件后,将调用TestObserver中的“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)
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?它似乎等于
@电子邮件