4

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

3 回答 3

10

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

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

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

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

更新:我自己从来没有机会这样做,但是根据该页面和this,您应该将以下内容添加到您的config/application.rbinside 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

于 2012-05-07T10:07:06.603 回答
2

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

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

于 2012-05-09T23:40:05.183 回答
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") 中。

请记住使链接相对。

于 2012-05-09T23:28:34.613 回答