2012-05-07 129 views
4

我來自.Net MVC背景,希望在RoR中做一個項目。具體來說,我開發了一個REST API。是否可以改變Rails項目中的文件夾結構?

我會描述我的想法,希望你能引導我走向正確的方向。我的api必須支持各種版本,而對api進行版本化的最強大的方法是複製每個版本的代碼。通過這種方式解決一個版本中的問題不會影響其他版本。當談到在.NET MVC中這樣做時,區域是您最好的朋友,因爲每個版本的源文件可以很好地通過使用區域進行分段。

所以我的問題是:在回報率是有可能改變的目錄結構,所以這個層次

app/ 
    controllers 
    /v1 
     c1_controller.rb 
     c2_controller.rb 
    /v2 
     c1_controller.rb 
     c2_controller.rb 
    models/ 
    /v1 
     m1.rb 
     m2.rb 
    /v2 
     m1.rb 
     m2.rb 
    views/ 
    /v1 
     view1.html.erb 
     view2.html.erb 
    /v3 
     view1.html.erb 
     view2.html.erb 

可以重新安排到這一點?

app/ 
    v1/ 
    controllers/ 
     c1_controller.rb 
     c2_controller.rb 
    models/ 
     m1.rb 
     m2.rb 
    views/ 
     view1.html.erb 
     view2.html.erb 
    v2/ 
    controllers/ 
     c1_controller.rb 
     c2_controller.rb 
    models/ 
     m1.rb 
     m2.rb 
    views/ 
     view1.html.erb 
     view2.html.erb 
+0

你能解釋一下多一點的差異版本之間有什麼,你是否會在同一個Rails的實例等運行多個版本?感覺你的問題可能有一個更好的解決方案(各種git分支或者其他),但很難知道沒有更多的繼續。 – Russell

+0

@Russell我願意接受任何建議。我無法預見新版本將如何改變。但是,我希望他們都在相同的Rails實例內,除非被認爲是不好的做法。 – Roman

+0

我想我所得到的是,它們是多個*不同*版本的類似功能,還是隻是新版本 - 相同功能的新版本最終將取代舊版本(必須保留一段時間兼容)? – Russell

回答

2

我認爲你可能會試圖解決你的問題稍微錯誤的地方。如果您需要同時支持多個版本的應用程序,並且能夠獨立修復它們等,那麼使用git作爲您的版本控制(如果您還沒有的話)併爲每個版本創建一個單獨的分支聽起來就像是一種方式去找我。 (我相信你可以做類似Mercurial,SVN等,但Git似乎是Rails的事實標準)。

下面是關於分支到一些信息的鏈接:http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging

+0

據我瞭解,問題啓動者希望同時在線提供所有版本:) – forker

+0

是的,儘管在單獨的rails實例中 - 我認爲在任何情況下都不太容易出錯!如果它們全都在同一個實例中,那麼如何將路線映射到控制器操作?每一個動作都需要一個單獨的路線來定義每個版本 - 這麼多地方會出現問題。 – Russell

+0

@Russell我同意每個版本都在一個單獨的rails實例中。這種方法的另一個結果是,您可以在不影響其他版本的情況下下載一個版本。這是一大優點。 – Roman

9

結帳這個頁面,它會給你的目錄結構的一些見解爲Rails 3+項目:

http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

由於Rails的3.0,應用程序和引擎有更靈活的路徑 配置(與之前的硬編碼路徑 配置相反)。這意味着您不需要將您的 控制器放置在應用程序/控制器中,但在任何您發現 方便的地方。

不要害怕它是關於引擎的事實,它在開頭說明: 每個Rails應用程序都是引擎。

UPDATE: 從未有機會做我自己,但根據該網頁,this,你應該添加下列的東西進入你的config/application.rbclass Application < Rails::Application

config.paths["app/controllers"] << "app/v1/controllers" 
config.paths["app/controllers"] << "app/v2/controllers" 
config.paths["app/controllers"] << "app/v3/controllers" 

config.paths["app/models"] << "app/v1/models" 
config.paths["app/models"] << "app/v2/models" 
config.paths["app/models"] << "app/v3/models" 

config.paths["app/views"] << "app/v1/views" 
config.paths["app/views"] << "app/v2/views" 
config.paths["app/views"] << "app/v3/views" 

檢查這個項目作爲一個例子: https://github.com/forker/multiversion

+0

嘿,謝謝你。我不確定究竟發生了什麼變化,所以Rails認可了新的安排。該頁面說:'應用程序類爲這個集合添加了更多的路徑。而在您的應用程序中,應用程序下的所有文件夾都會自動添加到加載路徑中。例如,如果你有一個app/observers文件夾,它將被默認添加。根據這一描述,新的安排應該得到承認,但我的應用程序並不這麼認爲。 – Roman

+0

顯然它不會比應用程序目錄中的一層更深。嘗試按照我在更新中顯示的進行配置。 – forker

+0

@阿曼,這有什麼好運氣? – forker

0

如果支持符號連接的系統上總是,那麼它可能是簡單的,只是符號鏈接

app/controllers/v1 -> app/v1/controllers 
app/models/v1 -> app/v1/models 
app/views/v1 -> app/v1/views 

等。或者換個方式。

Rails將像往常一樣讀取app/controllers/v1/c1_controller.rb,並假定它位於V1名稱空間(「class V1::C1Controller」)中。

請記住使鏈接相對。

相關問題