2011-05-04 42 views
8

我想在視圖中顯示MyModel子類的選擇列表。它不工作呢,所以對於健全檢查,我包括這在我的觀點:RoR:在第一次調用之後,MyModel.descendants在視圖中返回[]?

<%= MyModel.descendants %> 

第一一次渲染重新啓動服務器後,這個頁面,它顯示後裔的名單(有六個)。全部後續次,它顯示爲空列表[]

FWIW,我在我的初始化一個require聲明:

Dir[Rails.root.join("app/models/my_models/**/*.rb").to_s].each {|f| require f} 

...我已經驗證了他們得到必需的。

什麼@($%&是怎麼回事?

回答

7

當您使用需要,即使你my_model.rb被重新加載,因爲他們已經被加載內核將不再需要你的子類.rb文件。你」 ð不得不通過導軌自動加載。

基本上,你的第一個要求,導軌自動加載從my_model.rb,然後需要my_models/sub_model.rbMyModelSubModel類繼承MyModel,其中填充descendants陣列。 在你然而,請求後,再次自動加載MyModel(嘿,你處於開發模式),然後再次需要my_models/sub_model.rb。但是這一次,內核知道它已經加載了這個文件,並且不會再加載它。

我在一小時前遇到了這個問題,這導致我到您的帖子,並找到一個解決方案。我們需要的是每次調用主類時自動加載子類。

這裏是一個解決方案:

class MyModel 
    Dir[File.join(File.dirname(__FILE__),"my_models","*.rb")].each do |f| 
    MyModels.const_get(File.basename(f,'.rb').classify) 
    end 
end 

這些線路很可能是類的外放。如果您只有my_models中的文件而不在子目錄中,那應該就足夠了(這對我來說)。如果你有一些(例如MyModels::Car::Ford,你可能需要把同一種東西在子模塊(在my_models/car.rb

+0

+1對於發生什麼事的清晰解釋 - 謝謝。不幸的是,我的子類有「首字母縮略詞」名稱,比如「PGEService」,其名稱如「pge_service.rb」。我還沒有準備好將我的文件重命名爲'p_g_e_service.rb' - 至少現在還沒有! – 2011-05-07 04:30:17

+0

那麼,如果你的文件被命名爲PGEService.rb,你可以使用文件名(不帶'。classify'),但是如果它仍然是'pge_service.rb',我看不到任何簡單的解決方案...除非你做's = File.basename(f,'。rb')。split('_ 「); class_name = s.first.upcase + s.last.classify; MyModels.const_get(CLASS_NAME)'。是的,我知道有點難看。 – Wam 2011-05-08 16:45:03

+0

嚴格來說,你DID回答了我的問題「發生了什麼事」。所以你應該得到複選標記。我已經完善了我的問題,但我會把它作爲一個單獨的問題發佈。向前! – 2011-05-25 03:43:11

9

我有同樣的問題,加入解決了它一個config/initializers/preload_models.rb有:。

Dir[Rails.root + 'app/models/*.rb'].map {|f| File.basename(f, '.*').camelize.constantize } 

希望幫助別人

+0

這幫了我......謝謝! – erroric 2014-09-12 20:25:28

+0

如果你不幸地使用命名空間,這將不起作用:( – mscriven 2015-06-16 15:20:29

+0

這在幾分鐘後仍然會在內存不足時通過初始化程序加載 – Todd 2016-12-01 21:21:18

7

我剛啓用預先加載在每個環境:

config.eager_load = true

即使在爲類名使用名稱空間時,這也適用於我。

+0

我*認爲*這將是獲勝的答案。可以有人驗證這個工作嗎? – 2015-06-17 04:37:48

+0

這工作對我來說 – Philip7899 2016-01-20 20:06:25

+0

這是一個誤報,它將工作幾分鐘,然後掉出內存,無論你使用這個功能的頁面是什麼 - 只需刷新,最終,「後代」或「子類'將再次開始返回空白。 – Todd 2016-12-01 21:22:00

相關問題