2012-05-07 177 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”)中。

请记住使链接相对。

相关问题