Rails monkey patch gem问题

时间:2015-06-06 03:08:48

标签: ruby-on-rails

我正在使用https://github.com/mailboxer/mailboxer,我正在尝试添加自己的照片以附加到每条消息

在/config/initializes/extensions/mailboxer/message.rb

Mailboxer::Message.class_eval do
  has_many :photos, as: :imageable, :class_name => 'Photo'
end

这很好用,除了它随机抛出一个错误:

undefined method `photos' for #<Mailboxer::Message:0x6eb0758>

当我第一次启动服务器时,它可以工作。当我开始修改代码(可以是任何东西,没有任何与邮箱有关)我得到错误。我必须重新启动服务器才能让它再次运行。

我尝试将文件放在initializes文件夹之外,并在config / boot.rb中添加一个包含路径作为最后一行,同样的问题。

关于为何失去参考的任何想法?

1 个答案:

答案 0 :(得分:2)

当Rails检测到您的代码已被修改时,它会忘记&#34;它已自动加载的所有模型等,包括Mailboxer::Message。下次使用该模型时,它将从邮箱gem中重新加载,而不会使用猴子补丁。

为了确保你的猴子补丁&#34;坚持&#34;,我认为你需要给Rails一个提示,你希望你的代码在重新加载时重新应用。将补丁放在to_prepare块中可能会起到作用:

Rails.application.config.to_prepare do
  Mailboxer::Message.class_eval do
    has_many :photos, as: :imageable, :class_name => 'Photo'
  end
end