【问题标题】:Is it possible to alter the folder structure in a Rails project?是否可以更改 Rails 项目中的文件夹结构?
【发布时间】:2012-05-15 20:16:04
【问题描述】:

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

【问题讨论】:

  • 您能否详细解释一下版本之间的差异,您是否会在同一个 Rails 实例中运行多个版本等?感觉可能有一个更简洁的解决方案来解决您的问题(各种 git 分支或其他东西),但如果没有更多内容,就很难知道。
  • @Russell 我愿意接受任何建议。我无法预见新版本将如何变化。但是,除非被认为是不好的做法,否则我希望它们都在同一个 Rails 实例中。
  • 我想我的意思是,它们是相似功能的多个 不同 版本,还是新版本 - 相同功能的新版本最终替换旧版本(为了兼容性必须保留一段时间)?

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


【解决方案1】:

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

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

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

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

更新: 我自己从来没有机会这样做,但根据该页面和this,您应该在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

【讨论】:

  • 嘿,谢谢。我不确定到底要改变什么,所以 Rails 认可了新的安排。该页面显示:The Application class adds a couple more paths to this set. And as in your Application, all folders under app are automatically added to the load path. If you have an app/observers folder for example, it will be added by default。根据该描述,应该可以识别新安排,但我的应用不这么认为
  • 显然它不会比应用目录更深一层。尝试按照我在更新中显示的配置。
  • 我对这个说明不满意。你有过这样的工作吗?
  • 补充:即使您想要的方法确实有效,最好的方法是在单独的 Rails 应用程序中维护所有版本。然后,您可以将旧版本的应用作为引擎安装到最新版本。
【解决方案2】:

如果您始终使用支持符号链接的系统,那么仅使用符号链接可能会更简单

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

记得使链接相对。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 据我了解,问题发起者希望让所有版本同时在线可用:)
    • 是的,尽管在单独的 Rails 实例中,您仍然可以执行此操作 - 我认为在任何情况下都不容易出错!如果它们都在同一个实例中,您如何将路由映射到控制器操作?每个动作都需要为每个版本定义一个单独的路线 - 出错的地方太多了。
    • @Russell 我同意将每个版本都放在单独的 rails 实例中。这种方法的另一个结果是,您可以在不影响其他版本的情况下关闭一个版本。这是一大优势。
    • @Arman 是的,如果每个版本在不同的子域上运行,它也会使您的客户更简单,例如,这是他们必须指定他们想要的服务版本的唯一地方使用,而不是作为每个操作的 url 的一部分。
    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2015-12-05
    • 2014-07-09
    • 2018-03-11
    相关资源
    最近更新 更多