当rails重新加载类时,初始化程序中的控制器猴子补丁会丢失

时间:2014-10-27 10:08:09

标签: ruby-on-rails ruby devise monkeypatching

我试图在第三方gem中修补补丁控制器类。确切地说,我正在尝试添加参数包装来设计控制器。在initializers/wrap_parameters.rb中,我添加了以下内容:

Rails.application.config.after_initialize do
  DeviseController.class_eval do
    wrap_parameters :user, format: [:json]
  end
end

应用程序启动时效果很好,但是当我修改其中一个控制器类时,参数包装会立即停止工作。就像在没有上述补丁的情况下重新加载控制器类一样。

如何使我的猴子补丁持久?

由于

1 个答案:

答案 0 :(得分:1)

我之前遇到过类似的问题,试图在rails中加载延迟加载的monkeypatch代码。我能够通过将补丁包装在模块中然后在您正在编辑的类中扩展模块来修复它。在config / initializers中的新文件中会出现类似的情况:

module MyDeviseDecorator
  wrap_parameters :user, format: [:json]
end

class DeviseController < Devise.parent_controller.constantize
    extend MyDeviseDectorator
end

我可能有一个错误的设计类名称,它应该匹配你想要monkeypatch的任何东西。我不是100%这个方法会修复你的问题,就像它固定我的,但尝试一下;我会留下这个评论,但没有最低代表。