[這是一個後續問題「How I can modularize Rails model?」]如何使用rails在app/modules中組織名稱空間?
反正組織在app/models
目錄的Rails的課? 我是否必須爲所有類使用單個頂級命名空間?
最初的動機是,我想將不從ActiveRecord::Base
繼承的業務邏輯類放入app/models
目錄。在這個網站上搜索可以找到很多答案,推薦將商業邏輯類放在app/models
目錄中。我發佈了a different question,並得到了建議,可以將這些類放入lib
目錄。
現在我很好奇。我想將這些類放入apps/models
目錄中由其他人推薦的不同名稱空間和目錄中。可能嗎?
其實,我嘗試這一點,但在我看來,這就是軌道預計不會。如果我創建了這樣的類(如some_mod_name/class_in_mod.rb中的SomeModName :: ClassInMod),它不會被加載。另外,我在模塊中定義了常量。由於他們沒有加載,我不能使用它們。其實,rspec
工作沒有問題,但與rails server
,類不加載。我相信它與自動加載問題有關。
除了上面提到的類之外,從ActiveRecord::Base
繼承的類可以放入module
中的某些名稱空間中。我很好奇這個工作是否正常。
因此,換句話說,這樣的問題:我可以讓軌道高興通過配置這些文件被加載,或不在軌道設計的方式?
謝謝。我仍然想知道爲什麼加載順序與我預期的不同(你說這是隨機的,我認爲必須有一個觸發器會導致實際的負載),但將常數放在'app/models中顯然是個好主意/ logic.rb'現在會嘗試改變這種方式。 – shigeya 2012-03-16 00:10:31
經過測試。甚至沒有必要成爲'ActiveRecord :: Base'的子類在'module Logic'中放置所有常量,將它放在'app/models/logic.rb'中解決了我的問題。非常感謝你。 – shigeya 2012-03-16 00:47:20
實際負載由第一個執行的代碼行觸發,其中使用了該類。當ruby嘗試執行類似'if if; EvaluationLogic.new;否則PhaseLogic.new; end'和PhaseLogic尚未定義,然後(簡化一點)自動加載機制找到文件'phase_logic.rb',執行它,並嘗試再次執行該行代碼。還有其他方式像STI。 – Arsen7 2012-03-16 08:32:29