0

ハッシュから反転テンプレートをレンダリングすることは可能ですか? そうでない場合、次のようなハッシュに対応する複雑なテンプレートをどのように構築しますか?

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

残念ながら、ユーザー ガイドにはそのような例は示されていません。

4

1 に答える 1

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" )

これにより、テンプレートの内容がテストから完全に削除され、コントローラーがビューに送信する必要があるメッセージにのみ焦点が当てられます。

マニュアルには、それをレンダリングするコードとともに、かなり完全な機能の例があります。

ライブラリ (およびそのドキュメント) はかなり新しいので、これを取り上げてくれてありがとう。マニュアルを API ドキュメントとマージするための保留中のパッチがありますが、これは役立つはずですが、当面は例を見つけるのに最適な場所です。

お役に立てれば。より詳細な質問に個人的にお答えしたり (FaerieMUD.org で)、GithubBitbucketでプル リクエストを介してパッチを受け入れたりできれば幸いです。

于 2012-08-29T02:47:32.273 に答える