很晚這一個,但想到我會添加我的2P/2C。
我想盡量保持我的控制器乾淨的從控制器代碼,這是我基於請求類型和參數鬆散定義爲程序流程的任何代碼分開。例如,根據用戶是否登錄,爲請求類型選擇正確的模板或選擇正確的方法來調用。
當涉及到計算的迴應,我不喜歡垃圾有很多操縱模型,並設置實例參數代碼控制器。這很難測試,甚至更難以重複使用。我更願意推遲到另一個對象,並將單個值對象返回給模板。
有時候,我可以推遲到模型:也許這是一個簡單的查找,我剛剛發送的單一模式到模板,或模型數組。
也許我已經在模型中實現了一個有用的方法來返回適當的值或值對象。
不過有時我做的東西,不使用模型,或者使用幾種模式,或者說感覺並不像它實際上應該被搞亂了模型。在這種情況下,控制器和模型都不適用於代碼。
lib目錄感覺不對。我傾向於將lib目錄視爲包含代碼的地方,但我還沒有被困擾成爲寶石。如果我正在編寫的代碼在應用程序的上下文中是有意義的,那麼它並不好。
所以我轉向服務對象。在'app'文件夾下,我有一個'services'文件夾,其中包含封裝單個網站行爲塊的小型功能類。 (或者有時,協調其他幾項服務,爲控制器提供一個簡單的接口。)
這使我可以輕鬆控制我的控制器和我的模型,並且可以放置需要聯繫API的代碼。
如果您想更進一步,您可以將API本身封裝在一個包裝類(或一組類)中,並將它們保存在lib目錄中(可能在稍後的日期轉換爲gem)。然後,服務對象將執行使用適當的值(從控制器傳遞)調用API包裝的任務,並使用模板可以乾淨地詢問的內容進行響應。
當然,你可以走得更遠,並添加更多的圖層。例如,表示層可以位於服務對象(提供通用值)和特定視圖的格式數據之間。 (也許你想提供一個網頁和一個RSS源,他們需要不同的日期格式)
但你明白了。
「API調用」是什麼意思? – 2013-03-04 16:03:18
請提供您所關心的控制器代碼示例。 – thisfeller 2013-03-04 16:05:27
如果他們是外部API調用,我的想法是他們應該被視爲數據並放在模型中。這樣,您可以輕鬆添加到數據庫(用於節流)並保留SoC。只是我的想法,雖然我已經看到外部調用作爲lib中的聲明類。 – Nic 2013-03-04 16:05:44