From: Wakou Aoyama Date: 2002-05-24T01:05:31+09:00 Subject: [ruby-list:35235] Re: ruby_lib/html/ 青山です。 On Thu, May 23, 2002 at 12:52:10PM +0900, Tanaka Akira wrote: > > 内容要素のチェックを private, public で行うタイプのベースができてきた > > ふと思ったのですが、これをナイーブにやるとスレッドセーフにならないよう > な気がするんですが、実際のところどうなんでしょう? > > まぁ、CGI で使うだけならスレッドセーフでなくてもいい気もしますが。 あ、いえ、ご指摘の通りです。mod_ruby での使用が出来なくなりますね。 def foo_entity; end instance_eval("alias foo foo_entity") instance_eval("undef foo") この組合せに変更しようと思います。foo_entity() を定義しておいて、イン スタンス内でだけ、alias, undef で、利用する名前を用意、削除する、とい う感じです。 これなら影響はそのインスタンス内だけになると思われるので(簡単なテスト では、期待する動きになるようですし)、複数生成にも、スレッド利用にも対 応できそうな気がします。 (というか、やはり self のすり替えが便利そうだったので、すでに alias, undef に変更した所でしたから、この対応はすぐに出来そうです。) という事で、現在のインターフェイスとしては、こんな感じです。 require "cgi" cgi = CGI.new require "cgi/session" session = CGI::Session.new(cgi) require "html/html3" html = HTML::Html3.new(cgi) do html("pretty") do head{ title{"TITLE"} } body do h1{"head 1"} p do self << "Ruby's home page is " a("url"){"here"} self << "." end p do self << "Ruby's home page is " << a("href"=>"url"){"here"} << "." end form do textarea("field_name") br submit end end end end cgi.out(html.to_s) CGI::Session のセッション情報の埋め込みは、CGI::Session.new(cgi) とい うインターフェイスを取り入れて、HTML::Html3.new(cgi) としてみました。 こうして事前に渡しておくと、form() での埋め込みが素直にできて良いよう です。 このような感じで、cgi.rb, cgi/session.rb には手を加えず、そのまま追加 して使えるライブラリになりそうです。 あ、pretty の指定は html() よりも new() の方がいいかもしれませんね。 -- 青山 和光 Wakou Aoyama