Martin Fowler的PoEAA目录就像Ruby gem和Rails模块的存储库,例如,来自Rails的ActiveRecord ORM基于Fowler的ActiveRecord,而DataMaper gem基于Data Mapper模式。在Ruby中有没有Martin Fowler的两步视图模式的有用实现,例如与模板引擎相结合?
该模式分两步将域数据转换为HTML。如果你想把你的视图组合成解耦的、可重用的视图组件,这是特别有趣的。
实现两步视图的一个可能的解决方案似乎是XSLT转换,例如使用XML和Nokogiri。这意味着创建页面的中间xml表示:
- xml == (xslt) ==> xml
- xml == (xslt) ==> html
第二个可能的解决方案是使用JS模板引擎,如vue.js, KnockoutJS, reactive . JS或React。Rails执行第一步,创建一个中间视图, JS模板引擎执行第二步:
- Rails Template == (Rails) ==> View-Template
- View-Template + JSON-Data == (vue.js/KnockoutJS/reactive .js/React) ==> HTML
这对我来说是一个新模式,但是我可以用两种方法来概念化它。模式的核心似乎是首先构建一个中间表示,然后通过格式化步骤运行它。在每种情况下,无论显示的是ActiveRecord模型的哪个类,结果都是一个看起来相同的视图。
选项1:中间Ruby对象
使用演示器库(Draper, ActiveDecorator, rollyour -own),你可以将多个ActiveRecord类规范化到一个公共API。然后你编写一个单一的视图模板,可以用该API呈现对象。
在本例中,您为需要呈现的每个ActiveRecord类创建一个视图模板和一个Presenter对象。如果你需要添加新的数据到页面,你必须触摸模板和所有的Presenter类。
选项2:HTML + CSS
这很奇怪,但我认为HTML是一种有效的表示数据的格式,可以被认为是一种中间的、未格式化的表示。
在这种情况下,您为生成(几乎)相同HTML的每个ActiveRecord类创建一个视图模板(可能是部分的,可能是多态的)。然后使用CSS组件框架将HTML"格式化"为相同的呈现。HTML不需要完全相同,只要它完全符合组件框架所期望的即可。在这里添加数据意味着更改每个视图模板(CSS通常不需要修改)。
我认为这两种方法都是有效的。对我来说,第二种感觉更像"rails",但我认为它偏离了模式的精神,即使它在技术上符合(这可能是有争议的)。