0
我有一個Rails金屬類,基本上做了一次檢查,以確保系統中有一個管理員用戶,如果沒有,它會重定向用戶創建一個。現在,我使用機架會議,以避免重複檢查,但似乎存在以下問題:一次使用後可以「卸載」Rails金屬類嗎?
- 仍然爲每個會話一次檢查
- 通過首先檢查會話會減慢速度。
我想知道是否有可能指示Rails從鏈上「移除」或「卸載」類。這可以安全地完成嗎?還有其他建議嗎?
我有一個Rails金屬類,基本上做了一次檢查,以確保系統中有一個管理員用戶,如果沒有,它會重定向用戶創建一個。現在,我使用機架會議,以避免重複檢查,但似乎存在以下問題:一次使用後可以「卸載」Rails金屬類嗎?
我想知道是否有可能指示Rails從鏈上「移除」或「卸載」類。這可以安全地完成嗎?還有其他建議嗎?
一個最簡單的解決方案(儘管不是很乾淨)將存儲管理員用戶存在於類中的事實。
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) }
}
。我感覺金屬類將從頭開始加載每個請求。如果是這樣,這似乎沒有更快。這個假設我錯了嗎? – 2009-09-01 18:24:29
查看源代碼(http://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/rack/metal.rb),金屬會在應用程序啓動時加載。我已經添加了另一個關於如何實際刪除它的說明。但這是一個壞主意。 – cwninja 2009-09-01 20:04:34
更正,改爲編輯原來的答案。 – cwninja 2009-09-01 20:06:10