簡體   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