3

Martin Fowler 的PoEAA 目录就像 Ruby gems 和 Rails 模块的存储库,例如 Rails 的 ActiveRecord ORM 基于 Fowler 的ActiveRecordDataMaper gem基于Data Mapper 模式Martin Fowler 的两步视图模式在 Ruby 中是否有任何有用的实现,例如与模板引擎结合使用?

4

2 回答 2

2

该模式分两步将域数据转换为 HTML。如果您想将视图组合成分离的、可重用的视图组件,这将特别有趣。

实现两步视图的一种可能解决方案似乎是XSLT 转换,例如使用XML 和 Nokogiri。这意味着创建页面的中间 xml 表示:

  1. XML == (XSLT) ==> XML
  2. XML == (XSLT) ==> HTML

第二种可能的解决方案是使用 JS 模板引擎,如vue.jsKnockoutJSRactive.jsReact。Rails 执行第一步并创建中间视图,JS 模板引擎是第二步:

  1. Rails 模板 == (Rails) == > 查看模板
  2. 视图模板 + JSON 数据 == (vue.js/KnockoutJS/Ractive.js/React) ==> HTML
于 2014-05-28T16:52:40.160 回答
0

这对我来说是一个新模式,但我可以通过两种方式来概念化它。该模式的核心似乎是首先构建一个中间表示,然后通过格式化步骤运行它。在每种情况下,无论显示哪个类的 ActiveRecord 模型,结果都是一个看起来相同的视图。

选项 1:中间 Ruby 对象

使用 Presenter 库(DraperActiveDecoratorroll-your-own),您可以将多个 ActiveRecord 类标准化为单个公共 API。然后,您编写一个可以使用该 API 呈现对象的单一视图模板。

在这种情况下,您需要为每个需要渲染的 ActiveRecord 类创建一个视图模板和一个 Presenter 对象。如果您需要向页面添加新数据,则必须触摸模板和所有 Presenter 类。

选项 2:HTML + CSS

这很奇怪,但我认为 HTML 是一种表示数据的有效格式,并且可以被视为一种中间的、未格式化的表示。

在这种情况下,您为每个生成(几乎)相同 HTML 的 ActiveRecord 类创建一个视图模板(可能是部分的,可能是多态的)。然后,您使用 CSS 组件框架将 HTML“格式化”为相同的渲染。HTML 不需要严格相同,只要它都符合您的组件框架所期望的。在此处添加数据意味着更改每个视图模板(CSS 通常不需要修改)。

我认为这两种方法都是有效的。第二个对我来说感觉更像“rails-y”,但我认为它背离了模式的精神,即使它在技术上符合(这可能是有争议的)。

于 2014-05-23T20:40:05.710 回答