Ruby on rails 3 Rails 3:Mail::Message序列化后无法传递

Ruby on rails 3 Rails 3:Mail::Message序列化后无法传递,ruby-on-rails-3,yaml,actionmailer,Ruby On Rails 3,Yaml,Actionmailer,我想序列化一个Mail::Message对象,以便将其存储在数据库中并稍后发送。 我的第一次尝试是使用ActiveRecord的内置序列化方法,如下所示: class Email < ActiveRecord::Base serialize :mail # ... end 你知道怎么解决这个问题吗?为什么将对象序列化为yaml会使消息对象无法传递?是否有其他方法可以正确序列化消息对象,以便稍后发送?指定类名是否有帮助 serialize :mail, 'Mail::Messa

我想序列化一个
Mail::Message
对象,以便将其存储在数据库中并稍后发送。 我的第一次尝试是使用ActiveRecord的内置
序列化
方法,如下所示:

class Email < ActiveRecord::Base
  serialize :mail

  # ...

end

你知道怎么解决这个问题吗?为什么将对象序列化为yaml会使
消息
对象无法传递?是否有其他方法可以正确序列化
消息
对象,以便稍后发送?

指定类名是否有帮助

serialize :mail, 'Mail::Message' 

我意识到
mail\u clone
对象没有正确的传递设置,这导致
deliver
调用失败。浏览Rails源代码,我发现了以下解决方案:

mail_clone = Mail::Message.from_yaml mail_original.to_yaml
ActionMailer::Base.wrap_delivery_behavior mail_clone
mail_clone.deliver
因此,这可能是序列化
Mail::Message
对象的一种方法:

class Email < ActiveRecord::Base
  def mail
    @mail_cached || begin
      m = Mail::Message.from_yaml(self.read_attribute :mail)
      ActionMailer::Base.wrap_delivery_behavior m
      m
    rescue
      nil
    end
  end

  def mail=(val)
    @mail_cached = val
    write_attribute :mail, val.to_yaml
  end

  # ...
end
class电子邮件
不幸的是,没有。我不得不将其更改为
serialize:mail,mail::Message
,并将列默认值设置为NULL,但如果我是您(不知道您的业务需求),它只会引发与第一次描述的相同的异常(
ArgumentError:to_yaml
)中的参数数目错误(1代表0)
)我只是将邮件对象的属性存储为一个序列化数组,然后在以后需要实际发送时构建一个新的邮件对象。谢谢你的建议。如果没有别的办法,我可能会听从你的建议。不过,我想知道是否有更“railsy”的解决方案。找到了一个解决方案:添加
ActionMailer::Base.wrap\u delivery\u behavior mail\u clone
可确保
mail\u clone
的传递设置正确。我将尽快将其作为答案发布。这有助于我序列化Mail::Message。只使用了
serialize:mail,mail::Message
我得到了错误
TypeError:allocator未定义编码
。我使用Rails 4.1
mail_clone = Mail::Message.from_yaml mail_original.to_yaml
ActionMailer::Base.wrap_delivery_behavior mail_clone
mail_clone.deliver
class Email < ActiveRecord::Base
  def mail
    @mail_cached || begin
      m = Mail::Message.from_yaml(self.read_attribute :mail)
      ActionMailer::Base.wrap_delivery_behavior m
      m
    rescue
      nil
    end
  end

  def mail=(val)
    @mail_cached = val
    write_attribute :mail, val.to_yaml
  end

  # ...
end