トップページ⇒php
982コメント335KB

【Ruby】RubyでCGI

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/04(金) 12:57ID:c4hRtzGY
Rubyについて語るスレッドです。
関連リンクは>>2-3
0267nobodyさん03/06/25 08:55ID:???
module M
  class C
    def to_s
      "[an instance of class C in module M]"
    end
  end
end

p M::C.new

include M
p C.new
0268nobodyさん03/06/28 17:06ID:???
>>266
Apacheはそれで良いと思う。

モジュールとは端的に言うとインスタンスが作れないクラス。

Rubyは単一継承だからクラスは一つのスーパークラスしか持てないが、
モジュールであれば複数取り入れることが出来る。

class C0
  #...
end

module M0
  #...
end

module M1
  #...
end

class C1 < C0 # スーパークラスは一つのみ
  include M0
  include M1 # モジュールはいくつでも取り込める
  #...
end

これでC1はC0、M0、M1で定義されたメソッドを継承することになる。

また、モジュールの中でクラスや他のモジュールを入れ子にすることで
名前空間を作るのにも使用する。
267はその例。
026926503/06/28 17:58ID:t6ndrw6W
>>268
なるほど、、まぁ、はじめたばっかりの私にとってはクラスとかあんまりあからないので、大丈夫かなぁ・・・
ありがとうございました。
0270nobodyさん03/06/28 17:59ID:t6ndrw6W
名前欄の数字みすった。スマソ
0271nobodyさん03/07/08 12:15ID:cQ+4nOpS
多分既出だと思いますが
cgi.rbを使ってあぷろだを作っているのですが、マルチパートの扱いがよく分かりません。
FORMのENCTYPEがmultipart/formdataのとき

values = cgi['field_name'] # <== field_nameの配列
values[0].read # <== values[0]の本文
values[0].local_path # <== values[0]のローカルファイルのパス
values[0].original_filename # <== values[0]の元の名前
values[0].content_type # <== values[0]のcontent_type

でアップロードしたファイルのデータが取得できるのでしょうか?
0272nobodyさん03/07/14 19:21ID:???
秋風が吹く頃に勉強する予定なのでageといてやる。
0273山崎 渉03/07/15 11:06ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0274nobodyさん03/07/20 18:39ID:MTCslCJP
mod_ruby+eruby。
servlet+JSPより好きなので、age。
0275nobodyさん03/07/21 05:15ID:???
ruby-listでerbの改造について盛り上がってるね。これで速さがphp並になれば……。
0276nobodyさん03/07/21 14:33ID:???
私は % のエスケープも<% # %>も使わないので、
今回の流れで色々と複雑な事情があるのだなあと知りました。
陰ながら応援sage。
0277nobodyさん03/07/21 23:32ID:???
俺も使わないなあ。規模が違うってのもあるんだろうけど。
<% か <%= のどっちかだけ。
0278nobodyさん03/07/26 01:58ID:aoovL48q
初歩的な質問で申し訳ないんですが、
Rubyに標準で添付されているCGI.rbというライブラリでは、
タグを生成するときの大文字は変更できないんでしょうか?
最近ではxmlの関係もあって小文字で出力したいと思うんですが・・・

例)大文字 → <HTML><H1>
  小文字 → <html><h1>
0279nobodyさん03/07/26 02:32ID:???
あまり、調べてなくて申し訳ないんですが
RubyでPerlでいう↓のやつできませんか?

print << 'EOS';
  <html>
    <body>パパの特盛</body>
  </html>
EOS

>>278
タグの内部だけ?相当むずかしいんじゃないの?
タグ内のデータとかは大文字のままじゃないといけないんでしょ?
例:<INPUT NAME=OOMOJI> ⇒ <input name=OOMOJI>
たぶん、それはないと思う。変換機能がついたHTMLエディタとかどぞ
0280nobodyさん03/07/26 03:02ID:???
>>278
cgi.rb のかわりにこれの出力を require してみたらどうなる?

print(File.read($:.map{|i|i+"/cgi.rb"}.find{|i|File.readable?(i)}).gsub(/element\.upcase/,"element.downcase"))

>>279
×print << 'EOS';
○print <<'EOS';
028127903/07/26 03:16ID:???
>>280
うわあぁああぁぁ!
いぃち文字消したらでぇきたぁー!
サンクス!
028227803/07/27 00:09ID:zQkWZE8h
>>279-280
ご教示ありがとうございました。

結局、cgi.rbの中身を解析し、何箇所か修正を加えることで、
目的を達成することができたみたいです。
028327803/07/27 00:15ID:zQkWZE8h
補足

>>280さんの方法では、私の環境ではエラーになってしまいました。
0284nobodyさん03/07/27 01:41ID:???
cgi.rb suxx
0285nobodyさん03/07/27 02:19ID:???
>>284
CGI.pm がこの世に存在しなければあんなダメダメなライブラリにはならかったんじゃないかと想像。
0286nobodyさん03/07/27 04:47ID:???
narf のベータが取れるのを待つしか。
028727903/07/27 17:47ID:???
gsubで、引っかかった文字によって置き換える文字を変えたいのですが

print "pl rb pl rb".gsub( /(pl|rb)/, ($1=='pl') ? 'Perl': 'Ruby')
これだと ($1=='pl') がかならず false になってしまい、
Ruby Ruby Ruby Ruby になってしまいます
なにゆえでしょう?
0288nobodyさん03/07/27 18:05ID:???
>>287
簡単に言うとドラクエの勇者に「ロト」って名前付けられないのと一緒だ。
028927903/07/27 18:32ID:???
>>288
勇者にロトと名づける裏技、見つかりました

print "pl rb pl rb".gsub(/pl|rb/) {|m|
  m = (m=='pl')? 'Perl' : 'Ruby'
}
これでやったらできました。 |m| あたりが良くわからんけど。
ruby-lang.orgのgsubのリファレンスマニュアルみたらすぐ見つかりました。すみません

rubyの後方参照($1とか\1とか)はあんま柔軟なことできないみたいですね
ありがとうございました
0290nobodyさん03/07/27 21:35ID:???
>>289
> rubyの後方参照($1とか\1とか)はあんま柔軟なことできないみたいですね

下手な煽り文句ですね。
029127903/07/28 00:29ID:???
>>290
え?べつに煽ってはいませんよ
煽りに見えたならそれはすみません
0292nobodyさん03/07/28 00:51ID:???
>>289
puts "pl rb pl rb".gsub(/(pl|rb)/) { ($1 == 'pl') ? 'Perl' : 'Ruby' }
0293nobodyさん03/07/28 01:38ID:???
table = {'pl'=>'Perl', 'rb'=>'Ruby'}
pattern = Regexp.compile(table.keys.join('|'))
puts("pl rb pl rb".gsub(pattern){table[$&]})
029427903/07/28 02:04ID:???
>>292
そっちの方がカコイイ!!ありがとう

>>293
最適化されてしまった...
table.keys.join('|')って汎用的でおもしろいアイデアですね。ワラタ

おもしろいなRuby
0295nobodyさん03/07/28 22:58ID:???
> 294
キーが正規表現含むとおかしくなるから
quoteしたほうがいい

pattern = Regexp.compile(table.keys.collect {|key| Regexp.quote(key) }.join('|'))
029627903/07/29 00:45ID:???
>>295
いやぁ、やりたかったことはRubyでPHPみたいなファイルを実行するものなんですけどね。
↓こんな感じ。検索でヒットするパターンが多いからちょっと連想配列は使えないかも。
んで昨日、ERBというライブラリがあることを知ってこれは無駄になりました(´・ω・`)ショボーン

class EzRubyServerPage < Object
  @@boundary = '__BOUNDARY_EZ_RHP__'
  def eval( arg = "" )
    Kernel::eval "$_ = <<"+@@boundary+";\n" + arg.gsub( Regexp.compile('[<%][%>]=?') ){
      ($&=='<%' ) ? "\n"+@@boundary+"\nchop;print;":
      ($&=='<%=') ? "\n"+@@boundary+"\nchop;print;print ":
      ($&=='%>' ) ? "\n$_ = <<"+@@boundary+";\n":
      $&
    } + "\n"+@@boundary+"\nchop;print;"
  end
end
$tokumori = "パパの特盛"
EzRubyServerPage.new.eval("<html><body>ようこそ <%=$tokumori%>へ</body></html>\n")
029727903/07/29 00:53ID:???
>検索でヒットするパターンが多いからちょっと連想配列は使えないかも。

検索速度がorでつなげるより速そうだから [<%][%>]=? なんてしてるんですが
よく考えたらパターンは <%、%>、<%=、%>=、>%、%<、>%=、%<= の8通りだけだから連想配列の方が良いか
まあいいや、ERBとかいうのを使おう...。スレ汚しすんまそん。ハァ
0298nobodyさん03/07/29 00:57ID:???
ちなみに erb は Ruby 1.8 からは標準添付だ。
0299nobodyさん03/07/29 04:29ID:???
>>295
それじゃ自分で正規表現を指定できないではないか
0300nobodyさん03/07/29 23:02ID:SXyppRH6
CGI::Sessionを用いてセッション管理をしようと思うのですが、

利用しなくなったセッションファイルを自動で消去することは
できないんでしょうか?

ある本をよんだら、CGI::Session.sweep()を使うと書いてあった
のですが、エラーが出て使えません。
0301nobodyさん03/07/30 03:09ID:???
>>300
> ある本をよんだら、CGI::Session.sweep()を使うと書いてあった

sweepの定義はその本に書いあるのだと思われ。

利用しなくなったかどうかの判断基準は利用者によって異なる。
だから、一般的な方法は存在しない。
0302nobodyさん03/07/30 04:42ID:???
Rubikitiさん出版おめでとう。
0303nobodyさん03/08/05 00:21ID:???
843 :デフォルトの名無しさん :03/08/01 01:55
るびきち著『Rubyシェルプログラミング−irb&irbsh徹底活用−』8月4日発売です
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1798-6

基本的にこの人は他人との意思疎通が不可能な引き篭り星人な為、
何を言っているのか、何を伝えたいのかが全く見えません。故に専門書としては全く使えません

ではこの本のウリは何か?それは「他人をムカつかせるにはどうすればいいのか?」という厨房必修のスキル養成本としての価値に
他ならないでしょう。礼儀をわきまえない砕けすぎた態度から始まり、徐々に高圧的な態度へ、最後は相手を全否定し卑下し、自分が
相手に比べ、如何に優れた人間であるかを延々と語り続けるその試合運びに、各地厨房サイトから歓声が上がっております
なんとあの、2ちゃんねるネトヲチ板の皆様からも「掲示板のレスが反感を買うための例文集のようだ」とのお墨付きを得ております


そして「絶対零度つまらなギャグ集」としての機能も持ち合わせております。
なぜ、ウケ狙いの小ネタが、そこまでつまらないのか?スベろうと努力したってそこまでつまらない発言できるものではありません
正に天が与え給った才能だNe!! 合コンで思いっきりスベッて周りからジト目で見られてみたいソコのあなた!必読です。

参考文献 Rubyを256倍使うための本 魔道編
0304nobodyさん03/08/06 19:53ID:???
次は農道編キボンヌ
0305山崎 渉03/08/15 22:44ID:???
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0306nobodyさん03/08/23 03:43ID:???
eruby で エラーメッセージをブラウザに表示したいんだけど
できません。
MLをみたら $DEBUG = true
にするとありますが、そうしても変化がありません。。。

どうすればいいんですか?
0307nobodyさん03/08/23 19:08ID:???
Internal Server Error とかで eruby から何も返ってこないなら、
eruby 自体が起動されてないんじゃないの?
サーバーの設定を確認した方がいいような。
サーバーのエラーログが見れるのならそこを見るべし。
0308nobodyさん03/08/23 21:49ID:Ba5Hz+Nk
erubyは動いているんですが、apacheのログを開きながらデバッグするのが
面倒くさいだけなんです。

作っている時だけブラウザにエラーを表示してくれると助かるんですが。

eruby + mod_ruby で使ってます。
手元に環境がないんでversionがわかんないんですが、どちらも最新のものだと思います。
0309nobodyさん03/08/23 22:32ID:???
生成したrubyコードが parse error になる場合はstdoutには何も返さん罠。
コマンドラインで実行してみれ。
0310nobodyさん03/08/24 00:59ID:???
>>313

ruby の parse error は apacheのログには表示されますので、
それをブラウザに表示できる設定がないかなと思ったんです。

stderrはerubyでは拾えないということですか?
0311nobodyさん03/08/24 02:40ID:???
parse error って拾えるのか?
0312nobodyさん03/08/24 05:41ID:???
つーかコマンドラインで表示されるエラーを
なんでブラウザで見たいのかがさっぱり分からん
0313nobodyさん03/08/24 06:34ID:3TVF6Tbn
>312
CGIの引数渡すのがめんどくさいんだろ
031431203/08/24 10:00ID:???
>317
めんどくさいていうか、わかんないんです。
コマンドラインでPOSTデータやcookieデータを渡す方法が。

0315あぼーんNGNG
あぼーん
0316nobodyさん03/08/24 20:16ID:???
parse error になるかどうかと入力の有無は関係ないと思うのだが
031731203/08/25 00:38ID:???
別に parse errorばかりのことをいっているんじゃなくて、
例外が発生しても Internal server errorになるわけで。

できないんなら、できないでいいんだけど。
煽られるのって楽しいね。
0318nobodyさん03/08/25 01:25ID:???
おいおい、parse error以外の例外は大抵捕捉できるだろ
つーか、311=312なの??
0319nobodyさん03/08/25 09:27ID:???
どれが>>306かいまいち分からんが、
実行時の例外は $DEBUG=true しとけばブラウザで確認できるはずだから
インタプリタがコンパイルできるかどうかだけはコマンドラインでeruby実行して
調べれっていわれてるんでしょ。
0320nobodyさん03/08/25 14:17ID:IWdWlewI
IISでeRubyって無理なのかな・・・
0321nobodyさん03/08/25 15:13ID:???
ISAPIにすればいけるんでない?
0322nobodyさん03/08/25 18:59ID:???
あれ、eRubyは昔はparse error もバッチリブラウザに出てたけど・・・
ソース丸見えになるのでデフォルトでこれは勘弁と思ったものだ。
0323nobodyさん03/08/26 01:50ID:???
>323
mod_ruby を外したらブラウザに表示できました。
mod_ruby + eruby だと表示できないようです。

--
mod_ruby 1.0.5
ruby 1.6.8 (2003-03-26)
eRuby version 1.0.3
0324nobodyさん03/08/26 11:26ID:???
>>323
なるほど、と思ってソースのあたりをいろいろ探して見た
httpd.conf で
RubyRequire apache/eruby-run -> RubyRequire apache/eruby-debug
RubyHandler Apache::ERubyRun.instance -> RubyHandler Apache::ERubyDebug.instance

に変更したらparse error もブラウザに出た
しかし、HTTPサーバごとデバッグ環境にしなけりゃならんのだなあ・・・
0325nobodyさん03/08/26 22:36ID:???
埋め込みコード系(ERB,eruby)よりHTML::Templateを勧める。

http://raa.ruby-lang.org/list.rhtml?name=html-template2

他の環境(オブジェクト、DB)を変更する副作用が一切ないから
思う存分プレゼンテーションロジックのデバッグが出来る

ビジネスロジックはTest::Unitできちんとテスト書きましょう
0326nobodyさん03/08/31 13:41ID:???
テンプレートなら、amritaと言うライブラリもあるよ。
0327nobodyさん03/09/01 20:45ID:???
>>326

amritaは名前空間が判りづらいから嫌い。
0328nobodyさん03/09/02 06:02ID:jo93f+PB
rubyでCGIを書くにあたって、使ってるデザインパターンとかあります?
0329nobodyさん03/09/03 02:26ID:???
nora はどう?
0330nobodyさん03/09/03 02:41ID:6XWfASQR
HTML::Templateについて詳しいサイトないですか?
html-template.rdだけじゃ、複雑なことしたいときどーすりゃいいか分からん
0331nobodyさん03/09/03 22:54ID:???
1.8.0にしてみた
ENV[]から代入した文字列は変更不可だった
とりあえずひっかかったのはいまのとここれだけ
0332nobodyさん03/09/04 02:16ID:???
freeze するようになったんだっけか。
変数にアサインしてもStringオブジェクト自体はかわらんからね。
dup すれ。
0333nobodyさん03/09/04 10:48ID:???
サンクス。dupで対応したけど
Rubyの使用が最も少ないサーバ(ほとんどphpとPerl)を選んで
入れたのに、いきなり出たんでちょっと別のサーバに持ってくのは
慎重にならざるをえないな・・
0334nobodyさん03/09/07 18:35ID:90cSPk+W
コマンドラインからは動くCGI(HTMLを期待通り出力する)
が、サーバから動かない時って、どんな可能性があるでしょうか?
INTERNAL_SERVER_ERRORになってしまいます。
以下のことは確認しました。何か理由思いつかないでしょうか?

実行可能になっています。
そのディレクトリにwwwがファイルを作れるようになってます。
Apacheの設定でCGIを使えるようにしています。
#!/usr/local/bin/rubyを文頭に書いてます。
print "Content-type: text/html"はあります。
0335nobodyさん03/09/07 18:46ID:???
>>334
apacheのエラーログには何か出てない?
suEXEC関連のエラーなら、そっちのログも(ディレクトリがグループ書き込みできると実行できない)
033633403/09/07 19:18ID:90cSPk+W
>>335
やっと、できました!!
あーよかった。もうちょっとで一日が無駄になるところでした(^^;)

Apacheのログみてたら、book1~ に対してPermission deniedとか書いてあったので、
book1~を削除したら、動いてくれました。
PStoreの保存するファイルの名前がbook1で、コマンドラインから実行していた時に
book1やbook1~が作られていました。
book1の方は消していたのですが、book1~は気にせず残したままでした。

ありがとうございました。これからは、CGIが動かない時、Apacheのログもよむことにします。

ちなみに、他にでてたエラーのキーワードは、こんな感じです。
同じようなエラーが出た時に検索にかかるように、載せておきます。
Premature end of script headers: wook.cgi, referer: http://localhost/cgi-bin/***.html
/usr/local/lib/ruby/1.8/ftools.rb:23:in `initialize': Permission denied - ./book1~ (Errno::EACCES), referer: http://localhost/cgi-bin/***.html
/usr/local/lib/ruby/1.8/ftools.rb:23:in `open', referer: http://localhost/cgi-bin/***.html
from /usr/local/lib/ru
by/1.8/ftools.rb:23:in `syscopy', referer: http://localhost/cgi-bin/***.html
from /usr/local/lib/ruby/1.8/ftools.rb:43:in `copy', referer: http://localhost/cgi-bin/***.html
などでした。

ホントありがとうございました!
0337nobodyさん03/09/08 00:50ID:???
すんません
URLエンコードってどうすればよいんでしょ‥?
0338nobodyさん03/09/08 01:40ID:???
>>337

require 'cgi'
CGI.escape

そういう意味じゃなくて?
まあcgi.rbの中見ればわかる
033933703/09/08 01:57ID:???
取り敢えず、エンコード部分は、CGI.escapeと同じにしてみたんだけど
どうやら、IEが返してくるENV['HTTP_COOKIE']の値が想定していたのと違うみたい
writeから始まって、値のみがカンマ区切りで入っているデータが返ってくるようで
キーはどこいったの??って感じです

値を変えてみてしてみたのですが、返ってくるENV['HTTP_COOKIE']の値が変わらず‥
path指定を消して、再度値を変えてみてしてみたのですが、変わらず‥

以下のメソッドの結果をそのままプリントしているのですが、なにかまずいでしょうか?
def mkCookie(recipe, expiryDate = 30, path = nil)
 t = (Time.new.to_i + (expiryDate * 86400)).to_i
 t = Time.at(t).gmtime.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
 text = ''
 recipe.each do |key, value|
 text << "Set-Cookie: #{escape(key)}=#{escape(value)}; expires=#{t};" + (path ? " path=#{path};" : '') + "\n"
 end
 text
end


ひょっとして、クッキー使用前に使ってた
IE Powertoys Plus!のどこでもクッキーが???
034033703/09/08 08:54ID:???
おは
関係のあるCookieを全て削除したらどうやらスクリプト側で受け取るものは正常になっていました

Cookieのファイルを見た感じの違いはキー・値のペアの区切りが改行になっているか「*」になっているかの違いでした

どうしてそうなったのか、Cookieはなぜ上書きされなかったのかは不明‥
0341nobodyさん03/09/08 10:36ID:???
>>330
具体的になにがしたいんだ?
HTML::Templateでは、テンプレート側では複雑なことはできない。
複雑なこと(例えば複雑な条件式など)は、ぜんぶメインプログラム側で行う。
0342nobodyさん03/09/09 01:02ID:64dJm4LW
HTML::Templateってparam()にセットした配列がテンプレート内で
使われてないとエラーになんの?
0343nobodyさん03/09/09 09:58ID:???
>>342
どんなエラー?
実際のスクリプトとテンプレート、それにエラーメッセージをみせろ。
0344nobodyさん03/09/09 10:23ID:64dJm4LW
----hogehoge.rb----
templ = HTML::Template.new('hogehoge.html');
templ.param({'test'=>true});
array = [{'host'=>'book.2ch.net','board'=>'bizplus'},
{'host'=>'news5.2ch.net','board'=>'newsplus'},
{'host'=>'news4.2ch.net','board'=>'news'}];
templ.param({'array'=>array});
print(templ.output);
------------------

----hogehoge.html----
<!begin:test>
<!begin:array>
HOST:<!var:host>
BOARD:<!var:board>
<!end:array>
<!end:test>
---------------------

----error message----
./template.rb:78:in `node': node array not found (ArgumentError)

from ./template.rb:62:in `param'
from ./template.rb:61:in `each'
from ./template.rb:61:in `param'
from ./template.rb:59:in `each'
from ./template.rb:59:in `param'
from ./hogehoge.rb:9
--------------------
0345nobodyさん03/09/10 19:14ID:???
>>344
これって、どのHTML::Templateを使っている?
おれが使っているのは
http://raa.ruby-lang.org/list.rhtml?name=html-template2
なんだけど、テンプレートの書き方がなんか違うね。

それはそうとエラーの原因は、
(1)テンプレートで記述している木構造と
(2)テンプレートに与えているデータの木構造
が異なることが原因だろ。
(1)では test の下に array があるが、
(2)では test と array が兄弟になってないか?
034634503/09/10 20:46ID:???
>>344
おれの勘違いだったかも。

ループのまわりをif文で囲むと、どうもうまくいかないみたい。
表示する/しないをif文で制御するのではなく、
ループするデータがある/ないで表示を制御するとうまくいく。

------- sample.html ------
<TMPL_LOOP NAME="list">
HOST: <TMPL_VAR NAME="host">
BOARD: <TMPL_VAR NAME="board">
</TMPL_LOOP>
--------------------------

034734503/09/10 20:47ID:???
つづき。

-------- sample.rb -------
#!/usr/bin/ruby

require 'html/template'

test = true # or false

list = [
{ 'host' => 'book.2ch.net', 'board' => 'bizplus', },
{ 'host' => 'news5.2ch.net', 'board' => 'newsplus', },
{ 'host' => 'news4.2ch.net', 'board' => 'news', },
]
param = {}
if test then
param['list'] = list
else
param['list'] = []
end

template = HTML::Template.new('filename' => 'sample.html')
template.param(param)

print template.output
--------------------------
0348nobodyさん03/09/10 21:02ID:sTBsqDi+
html-template2の方に乗り換えようと思ったんですが
そっちもループをifで囲めないんですか?
0349nobodyさん03/09/11 05:07ID:???
>>348
おれがためした限りではできなかった。
作者に聞いてみれば?日本人だから、日本語のメールでOKだよ。
0350nobodyさん03/09/11 17:30ID:???
>>348
直したから試してみて(20030911 version)

<TMPL_IF NAME="list">
<TMPL_LOOP NAME="list">
HOST: <TMPL_VAR NAME="host">
BOARD: <TMPL_VAR NAME="board">
</TMPL_LOOP>
</TMPL_IF>

こんなのも、ちゃんと動くようになった。
0351nobodyさん03/09/13 02:40ID:???
>>350
作者登場!
0352nobodyさん03/09/13 02:53ID:???
>>350
見事に直ってた。さすが作者。


-------- sample.html --------------
<TMPL_IF NAME="flag">
<TMPL_LOOP NAME="list">
HOST: <TMPL_VAR NAME="host">
BOARD: <TMPL_VAR NAME="board">
</TMPL_LOOP>
</TMPL_IF>
-----------------------------------

------------ sample.rb ------------
#!/usr/bin/ruby

require 'html/template'

list = [
{ 'host' => 'book.2ch.net', 'board' => 'bizplus', },
{ 'host' => 'news5.2ch.net', 'board' => 'newsplus', },
{ 'host' => 'news4.2ch.net', 'board' => 'news', },
]
param = {}
param['flag'] = true
param['list'] = list

template = HTML::Template.new('filename' => 'sample.html')
template.param(param)

print template.output;
-----------------------------------
0353nobodyさん03/09/13 02:55ID:???
実行結果:



HOST: book.2ch.net
BOARD: bizplus

HOST: news5.2ch.net
BOARD: newsplus

HOST: news4.2ch.net
BOARD: news


>>348
ちゃんと作者に感謝しとけよ。
0354nobodyさん03/09/13 12:06ID:???
自演ですかぁ〜?
0355nobodyさん03/09/14 00:05ID:???
>>354
もちろんです。あたりまえじゃないですか。
素早い対応を印象付けるために、色々仕込んでるんですよ。
これでも。
0356nobodyさん03/09/15 08:44ID:???
cgikitってやつで作ってるんだけど、つらいね。
ページあたりにオブジェクトを割り当てるってのはまどころっこしいだけ。
(これはWebObject / Struts あたりの方法)

eRubyやPHPのようにページとロジックを直接結びつけるアプローチが
どれだけ正しいのかということがわかる。(MVCは向かないね)
0357nobodyさん03/09/15 08:47ID:4+LfvYPm
1ページ/1オブジェクト っていうアプローチは、
amrita のように出力するためだけにあるものならいいけど、
値の受け取り、処理、までやるとなると、複雑さが増すだけ。

むしろ、1処理/1オブジェクトというアプローチをとるべきだ。
ページの抽象化なんて Hash オブジェクトで十分
0358nobodyさん03/09/15 08:49ID:???
1 処理/ 1 オブジェクトっていうのは、純粋なServlet のアプローチか。
0359nobodyさん03/09/15 10:37ID:???
>>355
ワラタ
0360nobodyさん03/09/15 10:42ID:???
>>356
eRubyやPHPではロジックとビューとが分離できないじゃん。
友達いないやつなら一人でロジックとビューをやるしかないけど
そうでないなら分担して作業したほうがいいよ。
0361nobodyさん03/09/17 21:23ID:???
>>360
eRubyやPHPでロジックとビュー分離できますよ。
多くの場合、あえて分離しないだけで。
0362nobodyさん03/09/17 22:45ID:???
>>361
それ、参考になるようなドキュメントってありますか?
0363nobodyさん03/09/18 01:57ID:???
ttp://phpmvc.net/
0364nobodyさん03/09/18 11:16ID:???
>>363
みたけど、専用のフレームワークじゃん。それはずるいだろ。
そんなの持ち出していいんなら、なんだってロジックとビューの分離は可能だよ。
逆にいえば、そういうのを持ち出さないと分離できないってことじゃないか?
#まあPHPでは include() 使えば分離できるんだけどね。

つーか、もとの発言
>>356
では、
> eRubyやPHPのようにページとロジックを直接結びつけるアプローチが
> どれだけ正しいのかということがわかる。(MVCは向かないね)
なんてことをいってたので、それは違うだろ!というツッコミで
「ロジックとビューの分離」をあげてみた。
文章が悪かったかもしれんが、分離ができる/できないという話よりも、
分離をすべきか否かという話をしたい。

おれは分離したい。そのための手段として、CGIKitはいいと思う。
0365nobodyさん03/09/19 20:30ID:Z56dowS1

<TMPL_LOOP NAME='list1'>
 <TMPL_VAR NAME='hoge'>
 <TMPL_VAR NAME='foo'>
</TMPL_LOOP>
<TMPL_LOOP NAME='list2'>
 <TMPL_VAR NAME='hoge'>
 <TMPL_VAR NAME='bar'>
</TMPL_LOOP>
ってなった場合、
list1=[{'hoge'=>a,'foo'=>b1},{'hoge'=>a,'foo'=>b2},...]
list2=[{'hoge'=>a,'bar'=>c1},{'hoge'=>a,'bar'=>c2},...]
template.param({'list1'=>list1,'list2'=>list2})
みたいに配列の全要素にhogeを定義しないといけないんですか?
0366nobodyさん03/09/20 02:02ID:???
>>364
> 分離をすべきか否かという話をしたい。

どれを選ぶかは目的、規模、開発形態によるんじゃねーの?
(0) コードにHTMLを埋め込む
(1) HTMLを抽象化する(CGI::Html*)
(2) HTMLにコードを埋め込む(eruby)
(3) 別々に書く(amrita)
(4) 複数のセッションに対応する(div)

(3)はすごく良さげに見えるが、ID属性を利用するツールを
使ってるデザイナさんとファイルをやりとりする場合は
そのツールの挙動をよく知る必要がある。
PHP慣れしたデザイナさんと組む場合は(2)だと話がはやい。
(1)は画面内を部品化する場合に割と良いことがある。

別の例だと、Javascriptでサイズ変更不能な窓にする場合、
後からサイズの仕様が変わるのに備えるならprettyprintを
使って(0)でレイアウトを組むとか。
0367nobodyさん03/09/20 09:45ID:???
>>365

param["hoge"]が未定義だとnilが返ってくるから
IFで判定できるよ。

<TMPL_IF NAME='hoge'>
 <TMPL_VAR NAME='hoge'>
<TMPL_ELSE>
 hogeなし
</TMPL_IF>
■ このスレッドは過去ログ倉庫に格納されています