2009-09-01 25 views
0

我有一個Rails金屬類,基本上做了一次檢查,以確保系統中有一個管理員用戶,如果沒有,它會重定向用戶創建一個。現在,我使用機架會議,以避免重複檢查,但似乎存在以下問題:一次使用後可以「卸載」Rails金屬類嗎?

  • 仍然爲每個會話一次檢查
  • 通過首先檢查會話會減慢速度。

我想知道是否有可能指示Rails從鏈上「移除」或「卸載」類。這可以安全地完成嗎?還有其他建議嗎?

回答

2

一個最簡單的解決方案(儘管不是很乾淨)將存儲管理員用戶存在於類中的事實。

class EnsureAdminUser 
    def self.call(env) 
    if @admin_defined or Admin.any? 
     @admin_defined = true 
     [404, {"Content-Type" => "text/html"}, "Not Found"] 
    else 
     … 
    end 
    end 
end 

這可以爲您節省數據庫命中每個請求。

實際刪除,你需要做一些更激進的(邪惡)金屬:這似乎是一個明確的改善,因爲我不依靠存儲會話

ObjectSpace.each_object(Rails::Rack::Metal){|metal_handler| 
    metal_handler.instance_eval{ @metals.delete(EnsureAdminUser) } 
} 
+0

。我感覺金屬類將從頭開始加載每個請求。如果是這樣,這似乎沒有更快。這個假設我錯了嗎? – 2009-09-01 18:24:29

+0

查看源代碼(http://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/rack/metal.rb),金屬會在應用程序啓動時加載。我已經添加了另一個關於如何實際刪除它的說明。但這是一個壞主意。 – cwninja 2009-09-01 20:04:34

+0

更正,改爲編輯原來的答案。 – cwninja 2009-09-01 20:06:10

相關問題