用于UI模型和数据模型的Rails 3项目结构



这可能是一个非常愚蠢的问题,但我不清楚如何最好地管理它,所以我想把它放在这里,看看什么是常见的做法。

来自。net,我的web应用程序从来不是一个项目,这就是一切,我倾向于至少有一个数据层项目,它处理持久实体到数据库,并使这些模型以DB友好的方式表示所说的实体。然后我有我的UI项目,它有自己的模型,这些模型是UI实体的表示,它可能有基于验证的信息,并且很可能是一个更精简的模型,只暴露需要的东西。

所以我在这里想要表达的主要观点是,尽管我们可能有一个用户实体,但要表示的模型在UI和数据层中可能略有不同…

现在快进到rails,你创建了你的项目,它带有数据库连接(我相信你可以把它换成任何你想要的风格),验证和其他框架和功能的一整套方式。这似乎意味着我不再需要2个项目,只需要1个项目,因为它都包含在这里,并且都为我完成了,所以我只需要担心制作我的模型。

这是我有点困惑的部分,因为我们说我使用ActiveRecord我需要让我的模型和继承从ActiveRecord::Base,然后我需要设置这个模型如何连接到其他模型等,所以我有我的模型的数据问题排序,现在我需要设置我的UI问题,关于验证和字符串长度等…现在这些都去哪了…我假设在相同的模型上,但是模型不仅仅是数据的简单表示,它是一团东西包含对数据库和视图的关注,谁知道还有什么。

把所有东西都放在一个地方似乎有点奇怪。我知道在。net中有很多例子,在数据库中使用大型对象图表示,数据模型与UI模型非常不同,所以以这种方式将它们耦合到一个模型中是明智的,还是Ruby及其框架在这方面非常灵活,所以你没有这些相同的问题?如果是这样,是否有一些例子或文章可以在我的脑海中巩固您如何回避导致您分离关注点以获得可维护代码的正常问题……

=== Edit ===

只是试图澄清任何混乱,在我的帖子中,当我说我的视图模型和视图关注点时,我并不是指表示关注点。如果事情给你造成了那样的印象,我很抱歉。我的意思是,我可能有(在一个正常的。net示例中)一个UserStorage模型,它关注持久化一个User实体。然后在ui层有一个显示多个用户的视图和一个更详细地显示单个用户的视图。在这里你可能有2个不同的模型一个UserSummary模型和一个UserDetails模型,它们都部分地代表一个User实体,但都是为实际的视图定制的,因为你可能会遇到UserDetails也成为User和Company实体的组合的情况,这意味着有2个基于存储的类提供给一个基于视图的类。

中的例子和导游就像你应该1视图模型处理这些问题,以及存储的问题,在这种情况下,它看起来就像如果我是在这种情况下我有一个视图模型,这是一个组合的用户和公司似乎奇怪这个视图层类担心其存储,它永远不会存储本身,它是作为2单独的模型存储在数据库/数据存储。

这是我想在这里得到的真正的问题,它似乎是紧密耦合你的视图到你的存储问题,我习惯了2种不同的东西,不应该混合…就像把主菜和布丁放在同一个盘子里……

在普通Rails中,没有"视图模型"这种东西。

模型处理所有业务逻辑,包括查询和持久化、关联和验证。您似乎将验证视为视图的关注点,但这实际上是您的模型完整性的核心关注点:它确实属于那里。

这并不是说验证也不应该发生在视图(客户端)中,但是模型具有您的核心业务规则,并且是最终检查验证规则的地方。

您将希望您的模型包含应用程序的大部分逻辑。这意味着检查用户是否有效或活跃,查找相关记录等。几乎任何非表示性的东西都属于模型。

在视图中,Rails提供了用于格式化的辅助方法。这些来自视图实例中包含的模块。辅助方法可以访问视图的实例变量(你的模型),并用来表示它们。

在某些情况下,将裸模型传递到视图中会使事情难以保持模块化和组织化。有些人喜欢在将模型传递给视图之前使用呈现器来包装模型。它可以帮助组织代码,但它也是一个额外的层。呈现器在Rails中不是标准的,但是如果对您的应用程序有意义,可以使用普通ruby对象或draper之类的库添加此模式。

编辑:哦,看,今天有一篇关于这个话题的最优秀的博客文章,来自最优秀的Thoughtbot。

一句话:

  • 如果它是关于数据(存储,完整性等),它进入模型
  • 如果它是关于处理/计算数据(例如查找所有未决订单),它将进入模型
  • 如果它是关于显示数据的(待定订单应该有一个红色的取消按钮),它会进入视图

既然你似乎是一个有经验的开发人员,你可能会从这本书中受益http://www.manning.com/katz/它面向的是刚接触Rails的开发人员(但不是web编程)。

或者,也有一个免费的在线教程http://ruby.railstutorial.org/

当然,Rails指南总是一个很好的信息来源:http://guides.rubyonrails.org/

在你的问题中没有提到MVC,你应该看看模型-视图-控制器模式。

您还应该了解迁移是如何工作的。

最新更新