2010-12-02 103 views
13

我第一次創建了一個相當複雜的Rails應用程序。如何組織Rails應用程序

我想知道什麼是按文件夾組織該應用程序的最佳方式。到現在爲止,我會在一個應用程序(所有模型,控制器,etC)下做所有事情,但是閱讀一些開源代碼,我意識到他們將所有東西放在不同的應用程序下。

例如Spree Commerce。他們有一個通用文件夾,裏面有不同的應用程序(API,核心,管理員等)。這是如何做到的,是做到這一點的最佳方式?

我想指出最好的方法來做到這一點(一本書,博客,任何東西),所以我可以理解我可以如何構建我的應用程序以供將來維護。

謝謝

回答

7

順便說一句,我認爲你的問題的標題有點混亂。 Rails通過使用約定而不是配置來定義'如何組織Rails應用程序'。我認爲你的問題是關於如何架構師你的應用程序,而不是任何Rails的具體。也許調整標題?除此之外,不知道有關項目的更多細節,這是一個棘手的問題,但我會給它一個答案。

所有的應用程序應該從簡單的開始,如果你相信(像我一樣),你應該從建立the simplest thing that could possibly work開始。鑑於此,由於您使用的是Rails,因此很可能最簡單的事情就是將您的應用程序構建爲一個vanilla Rails 3應用程序。這可能(我說'可能',因爲我不知道關於應用程序的任何細節)允許您快速啓動並運行應用程序的測試版,而無需擔心項目開發階段的複雜性不是問題。

如果你需要創建一個XML或基於JSON的API,然後Rails使得使用該really easy標準的框架,它可以讓你花更多的時間思考API設計不是如何編寫它,它的API設計是最重要的一件事情。

類似地,您的管理員網站可以是不同命名空間中的同一應用程序的一部分。如果你後來發現你希望它作爲一個單獨的應用程序,你可以做到這一點(也許你可以使用你設計的真棒API來促進這一點),但是爲什麼要設計它增加了複雜性(並因此延長了開發時間)如果你沒有足夠的理由這樣做,首先要做的是?

當您的應用程序啓動並運行並且人們開始使用它後,您就會開始瞭解瓶頸的位置以及設計可以改進的地方。在此階段,如果有需要,您可以開始將應用程序的某些部分移至可擴展解決方案,例如將您的API作爲獨立服務運行,引入緩存,更改數據存儲以及其他改進和優化。

即使您的應用程序非常成功(我希望它是!),然後重新設計你的應用程序,繼續運行現有的服務仍然是完全可能的,正如Twitter已經證明的那樣。只要堅持到Knuth's statement,你會沒事的。

關於閱讀材料,這是一個棘手的問題。對我來說,很多XP和敏捷開發經典教程告訴我如何進行程序和應用程序設計。我還會檢查this StackOverflow topic的書本靈感。

祝你好運!

2

恕我直言,我將創建非常複雜的項目作爲一個應用程序。我有理由相信Spree和Radiant構建在單獨的應用程序之下,因此,在開源社區的幌子下,貢獻者可以輕鬆地貢獻代碼而不會篡改核心數據以及應用程序的核心工作。

否則,你應該沒問題,只是把它作爲一個應用程序來構建。保持整潔。

6

Spree使用Rails的RailtiesRails::Engines)。 Rails 3引入了Rails,使其更加模塊化,易於擴展。 Rails 3本身是Railties(ActiveSupport,ActiveModel,ActiveRecord等)的集合。

如果你正在開發一個複雜的應用程序,我會建議花一些時間來計劃它的架構。在沒有任何初始規劃的情況下設計一個複雜的應用程序肯定會在維護噩夢的道路上結束。它還爲新團隊成員引入了一個巨大的學習曲線,減慢了您的新功能介紹,當然還有挫敗感。

無論如何,不​​要過度優化,但不要忘記根據您的需求設計您的架構。

+2

這是我認爲的最佳答案。 – nemesisdesign 2012-06-28 10:35:41

0

這裏是什麼使我清醒了好幾年的回報率的發展:

  1. 我使用Rails的引擎,但讓他們在相同的代碼庫爲主體的應用程序。這是很好的入門模塊化Rails應用程序: https://github.com/shageman/the_next_big_thing

  2. 無論我,我可以儘量減少耦合和可用的組合物,使事情容易測試,可重用性和可維護性。這有助於最終提取模塊或引擎作爲單獨的寶石。組合由路由(掛載),目錄覆蓋(資產),依賴注入或配置完成。

  3. 如果我不需要重新使用引擎,我把它放在與單個部署單元的主應用程序相同的代碼庫中。感謝這一點,我不需要在我的IDE中的項目之間切換。在開發環境中,引擎代碼的任何更改都可以通過Rails重載機制立即獲得。