繁体   English   中英

在Rails初始化程序中将模块包含到ruby类中

[英]Include Module into ruby class in a Rails initializer

在Rails的初始化程序内部,我试图在Rails模型中包含一个模块

User.send :include, Something

这适用于第一个请求,但不适用于第二个/第三个/等。 由于Rails模型的重新加载。 我尝试使用ActionDispatch::Callbacks.to_prepareActionDispatch :: Callbacks.to_prepare ,我正在使用Rails 3.0.9)

ActionDispatch::Callbacks.to_prepare do
  User.send :include, Something
end

但是当我尝试在第二/第三/等模块模块中定义的方法时,我不断从用户实例中收到NoMethod错误。 请求。

我的问题是:是否有一种方法可以可靠地将模块包含在初始化器的Rails模型中,而又不会引起开发怪异?

更新:不可能

显然,没有中间件是不可能做到的。 如果您不同意,请在下面添加答案。 对于我的用例来说,这不是可接受的解决方案,因此我什至没有尝试过。 祝好运。

编辑:更新了调试信息

我在玩ActionDispatch::Callbacks.to_prepare了一点,当我将它放在初始化器中时,我注意到了一些奇怪的事情:

ActionDispatch::Callbacks.to_prepare do
  puts "to_prepare ==:#{User.object_id}"
end

这在我的控制器中

puts "controller ==:#{User.object_id}"

在第一个请求,我得到这个:

to_prepare ==: 2297196200
controller ==: 2297196200
to_prepare ==: 2297196200
to_prepare ==: 2324202920
to_prepare ==: 2318560780

在第二个请求,我得到这个:

to_prepare ==: 2326823900
controller ==: 2326823900
to_prepare ==: 2317901920
to_prepare ==: 2326746040
to_prepare ==: 2314369160

我注意到的第一件事是对to_prepare的多次调用,这很奇怪。 我注意到的第二件事是在第一个请求(该请求有效)中,直接在控制器被调用之前和之后的object_id是相同的,并且它们不在任何后续调用中。 如果有人能阐明为什么发生这种情况以及如何解决它,将不胜感激。

使用config.after_initialize挂钩是否有帮助? 由于类重新加载,这是特定于开发环境的问题。

几乎可以肯定的一件事就是通过中间件注入模块,尽管很难知道这是否适合您的工作。

class AddYourModuleMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    User.send(:include, YourModule) unless User < YourModule
    @app.call(env)
  end
end

使用config.middleware.use AddYourModuleMiddleware将其添加到中间件链中,或者将use AddYourMiddleware放在ApplicationController的开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM