从哈希渲染反演模板

时间:2012-08-27 16:12:18

标签: ruby inversion

是否可以从哈希渲染反转模板?如果没有,如何构建对应于散列的复杂模板,例如:

{ :a => [ { :b => 'foo', :c => 'bar' }, { :d => 'blah', :e => 'blubb'} ] }

不幸的是,用户指南没有显示这样的示例。

1 个答案:

答案 0 :(得分:0)

这取决于您希望如何呈现哈希。假设代码:

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=&gt;[{:b=&gt;"foo", :c=&gt;"bar"}, {:d=&gt;"blah", :e=&gt;"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" )

这样就完全从测试中删除了模板内容,只关注控制器应该向视图发送的消息。

有一个功能齐全的示例in the manual以及the code that renders it

图书馆(及其文档)相当新,所以感谢你提出这个问题。我有一个挂起的补丁,可以将the manual与API文档合并,这应该会有所帮助,但与此同时它可能是查找示例的最佳位置。

希望这会有所帮助。我很乐意亲自回答更多深入的问题(在FaerieMUD.org上发表),或者通过GithubBitbucket的拉取请求接受补丁。