2006年4月13日

[ruby-list:42009] 動的変数を使ったerbテンプレートクラス(Re: 動的な変数代入について)

rubikitch さま

島津と申します。
先日に続き、ものすごく早いお返事、
ありがとうございます。救われました。


>一時変数に代入してからevalするとできます。

>
>hoge = "foo"
>bar = "hoge"
>x = "baz"; eval("#{bar}=x")
>p hoge

このような方法があったのですね。
よくよく考えれば、たしかに納得いきますが、
これを見るまで、まったく思いつきませんでした。
Hashもいいですね。ありがとうございます。

なお、余談ですが、
これを行って何をしようとしていたかを
以下に記載させていただきます。
どなたかにTipsとしてお役立ていただければ幸いです。

erbを活用したHTMLテンプレート関連の処理において、
今回のロジックを使いました。
個人的に、いままでPHPのSmartyに馴染みがあったのですが、
erbをSmartyライクに利用できるクラスを作成しました。

--[Rubyスクリプト]------------------------------
#!/usr/bin/ruby
require 'erb'

class RubyTemplate
include ERB::Util
def initialize(filename)
@template = File.read(filename)
@data = Hash.new
@erb = ERB.new(@template, 0, 2)
end
def assign(key,var)
@data[key] = var
end
def append(key,var)
@data[key].concat(var)
end
def display
@data.each do |k,v|
eval(" @#{k} = v ")
end
@erb.result(binding)
end
end

rt = RubyTemplate.new("erb_01.html")
rt.assign( "name", "Company list" )
rt.assign( "companies", ["Apple","Microsoft","Sun"] )
print rt.display
--------------------------------

--[erbテンプレート]------------------------------
<html>
<head><title></title></head>
<body>
<h1><%=h @name %></h1>
<ul>
<% @companies.each do |x| %>
<li><%=h x %></li>
<% end %>
</ul>
</body>
</html>
--------------------------------

erbにはerbなりの作法があると思われますので、
邪道といわれてしまいそうですが。。。
クラスにて、テンプレートで用いる変数の指定が
不要になりますので、多少は便利に使えるのではないかと思われます。

以上です。
ご丁寧にアドバイスくださりありがとうごうざいました。


Yuki SHIMAZU
y.shimazu@xxxxx

投稿者 xml-rpc : 2006年4月13日 00:31
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/41864
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。