是否可以从哈希中呈现反转模板?如果不是,如何构造一个与哈希相对应的复杂模板,例如:
{ :a => [ { :b => 'foo', :c => 'bar' }, { :d => 'blah', :e => 'blubb'} ] }
不幸的是,用户指南没有显示这样的例子。
这取决于您要如何呈现散列。假设代码:
require 'inversion'
the_hash = { :a => [
{ :b => 'foo', :c => 'bar' },
{ :d => 'blah', :e => 'blubb'}
] }
当然,您可以按原样渲染它:
<!-- prettyprint.tmpl -->
<code><?pp the_hash ?></code>
进而:
tmpl = Inversion::Template.load( 'prettyprint.tmpl' )
tmpl.the_hash = the_hash
puts tmpl.render
这将呈现为:
<!-- prettyprint.tmpl -->
<code>{:a=>[{:b=>"foo", :c=>"bar"}, {:d=>"blah", :e=>"blubb"}]}</code>
假设你想对哈希做一些更复杂的事情,比如渲染它的一些成员:
<!-- members.tmpl -->
A's first B is: <?call the_hash[:a].first[:b] ?>
A's first C is: <?call the_hash[:a].first[:c] ?>
A's second D is: <?call the_hash[:a][1][:d] ?>
A's second E is: <?call the_hash[:a][1][:e] ?>
其中(除了加载 'members.tmpl' 之外,使用与前一个示例相同的代码)将呈现如下:
<!-- members.tmpl -->
A's first B is: foo
A's first C is: bar
A's second D is: blah
A's second E is: blubb
但是构建一个像哈希一样的大型复杂数据结构,然后将其与模板合并并不是真正打算使用 Inversion 的方式。这个想法实际上是加载模板为您提供了一个带有 API 的 Ruby 对象,适合在渲染之前传递和增量添加内容。无需构建哈希,只需传递模板对象本身并在其上调用访问器,然后让它提取构建视图所需的内容:
tmpl.users = User.all
tmpl.company = "ACME Widgets, Pty"
tmpl.render
这还具有更易于模拟的优点:
# (rspec)
tmpl = mock( "members template" )
tmpl.should_receive( :users ).with( User.all )
tmpl.should_receive( :company ).with( company_name )
tmpl.should_receive( :render ).and_return( "the rendered stuff" )
这从测试中完全删除了模板内容,并且只关注控制器应该向视图发送哪些消息。
该库(及其文档)相当新,因此感谢您提出这个问题。我有一个未决的补丁可以将手册与 API 文档合并,这应该会有所帮助,但同时它可能是查找示例的最佳位置。
希望这可以帮助。我很乐意亲自回答更深入的问题(访问 FaerieMUD.org),或者通过Github或Bitbucket上的拉取请求接受补丁。