Rails 3中的分层MVC?
Posted
技术标签:
【中文标题】Rails 3中的分层MVC?【英文标题】:Hierarchic MVC in Rails 3? 【发布时间】:2011-04-03 23:41:46 【问题描述】:我读过关于 HMVC(分层模型视图控制器)和它的灵活结构。
看看这张照片:
http://techportal.inviqa.com/wp-content/uploads/2010/02/MVC-HMVC.png
我想知道 Rails 3 插件是否是 Rails 3 中 HMVC 的答案?
【问题讨论】:
【参考方案1】:根据对 Toby 的回答的 cmets,您似乎希望能够将 MVC 应用程序用作新应用程序中的组件。 Rails 引擎(参见http://rails-engines.org)提供了这个功能。您只需安装引擎 gem 并将应用程序放在供应商/插件中,它的模块/视图/控制器都可以访问。
这并不真正符合新应用程序中的控制器委托给其他控制器的 HMVC。但像托比一样,我看不到这样做的好处。
Engines 方法的好处在于,您只需将模型的一个版本添加到新的应用程序 app/model 文件夹中即可覆盖插件中的任何模型(同样适用于视图和控制器)
我重写了应用程序/视图/布局,以使我的身份验证应用程序/插件具有与其包含的应用程序相同的外观和感觉。
对于 Rails 3,Railtie 取代了引擎并得到官方支持(并且实际使用过 - Action Mailer 是一个 Railtie 插件。不过我自己还没有使用它。
查看http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html
这里也有一篇不错的文章http://www.igvita.com/2010/08/04/rails-3-internals-railtie-creating-plugins/
【讨论】:
使用 Railties 与 Rails 插件相比有什么区别/优势? Railtie 的理由可以在这里找到engineyard.com/blog/2010/… 来自 Railtie 站点“开发 Rails 扩展不需要任何 Railtie 实现,但是如果您需要在启动期间或启动后与 Rails 框架进行交互,那么您需要使用 Railtie 进行交互。”【参考方案2】:Rails 有插件很长时间了。
我怀疑控制器无法分派到另一个控制器,沿链传递请求对象是否存在技术原因。我只是不知道这样做你会得到什么——图表看起来像意大利面条。
对我来说,这是对 MVC 的误用。我建议将逻辑推送到较低级别的模型和类中并创建一个位于该逻辑前面的单个控制器,而不是创建一个控制器链,这样更简单、更易于维护。
【讨论】:
我不同意这里。也许我正在添加一些可以独立的新功能......那么将它作为独立的 MVC 组件而不是将所有内容合并到主应用程序 MVC 中会很好,从而使其可重用于其他项目。此外,您在图中看到的所有 MVC 组件都可能来自第三方供应商。我不会在我的主应用程序 MVC 中混合它们。该图对我来说似乎不是意大利面条,它似乎结构很好。委托而不是把所有东西都放在一个越来越大的大块中。 我认为这是一个泄漏的抽象。处理业务逻辑的结构良好的对象层无法以更精细和更容易测试的方式实现,它带来了哪些优势? 因为我对建筑风格有认真和深思熟虑的保留,所以投票给我有点苛刻。 听从。也许测试那些 3rd 方 MVC 组件不是我的工作。它们就像我可以向应用程序本身添加/删除的附加组件。我对“图表看起来像意大利面条”这句话投了反对票。如果您添加“给我”,我认为这听起来会更好,我会再次投票给您:) 因为这对 HMVC 来说听起来太刺耳了...但我原谅你:) 投票按钮已锁定..您必须稍微编辑一下答案,这样我才能投票 =)【参考方案3】:在 Rails 3 博客文章中,DHH 提到了the Cells 项目。我没有使用它,但我会检查一下。
购物车示例很好地展示了这种功能如何清理您的应用程序代码。检索数据的代码应该放在控制器的某个地方。在每个动作中或在过滤器之前。 Cell 似乎是更好的解决方案。
【讨论】:
【参考方案4】:请看这篇 rubyonrails-talk 帖子:https://groups.google.com/forum/#!topic/rubyonrails-talk/0c4TT7UOGCw
【讨论】:
以上是关于Rails 3中的分层MVC?的主要内容,如果未能解决你的问题,请参考以下文章