是否可以在Rails项目中更改文件夹结构?

我来自.Net MVC背景,希望在RoR中完成一个项目。 具体来说,我正在开发一个REST API。

我将描述我的想法,希望你能引导我朝着正确的方向前进。 我的api必须支持版本,而最强大的api版本方法是复制每个版本的代码。 这样在一个版本中修复问题不会影响其他版本。 在.NET MVC中进行此操作时,区域是您最好的朋友,因为每个版本的源文件可以通过使用区域进行细分。

所以我的问题是:在RoR中,可以更改目录结构,以便进行此层次结构

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 

我想你可能正试图在一个错误的地方解决你的问题。 如果你需要同时支持多个版本的应用程序,并能够独立修复它们等等,使用git进行版本控制(如果你还没有)并为每个版本创建一个单独的分支听起来像这样的方式去找我 (我相信你可以和Mercurial,SVN等类似,但Git似乎确实是Rails事实上的标准)。

以下是有关分支的一些信息的链接: http : //git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging

查看此页面,它将为您提供有关Rails 3+项目的目录结构的一些见解:

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

从Rails 3.0开始,应用程序和引擎具有更灵活的路径配置(与之前的硬编码路径配置相反)。 这意味着您不需要将控制器放置在应用程序/控制器上,而是放在您认为方便的任何地方。

不要害怕它是关于Engines的事实,它在一开始就说:每个Rails应用程序都是一个引擎。

更新:从来没有机会自己这样做,但根据该页面,你应该在config/application.rb class Application < Rails::Application config/application.rb添加以下内容:

 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

如果您总是在支持符号链接的系统上,那么只需符号链接就可能更简单

 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 ”)中。

请记住使链接相对。