两步视图模式

时间:2014-05-23 16:31:19

标签: ruby-on-rails ruby poeaa

Martin Fowler的PoEAA catalog就像是Ruby gems和Rails模块的存储库,例如Rails的ActiveRecord ORM基于Fowler的ActiveRecordDataMaper gem基于Data Mapper pattern {3}}。在Ruby中是否有任何有用的Martin Fowler two-step view pattern实现,例如:与模板引擎结合使用?

2 个答案:

答案 0 :(得分:1)

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

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

  1. XML ==(XSLT)==> XML
  2. XML ==(XSLT)==> HTML
  3. 第二种可能的解决方案是使用JS模板引擎,如vue.jsKnockoutJSRactive.jsReact。 Rails执行第一步并创建中间视图,JS模板引擎创建第二步:

    1. Rails模板==(Rails)==>查看模板
    2. 查看模板+ JSON-Data ==(vue.js / KnockoutJS / Ractive.js / React)==> HTML

答案 1 :(得分:0)

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

选项1:中级Ruby对象

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

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

选项2:HTML + CSS

这很奇怪,但我认为HTML是表示数据的有效格式,可以被视为中间的,无格式的表示。

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

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