我来自.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
答案 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"
答案 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
”)。
请记住使链接相对。