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

时间:2012-05-07 10:00:05

标签: ruby-on-rails ruby-on-rails-3 api rest

我来自.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

3 个答案:

答案 0 :(得分:10)

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

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

  

自Rails 3.0以来,应用程序和引擎的路径更加灵活   配置(与之前的硬编码路径相对   组态)。这意味着您不需要放置您的   app / controllers的控制器,但在你找到的任何地方   方便。

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

更新: 从来没有机会自己这样做,但根据该页面和this,您应该在config/application.rb内的class 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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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”)。

请记住使链接相对。