こんにちは。いつもお世話になっています、みかみと申します。
オブジェクト指向プログラミングに少し慣れましたが、未だ初心者
です。今は、Ruby で掲示板を作っているのですが、再読み込み時に
問題が生じて困っています。どうぞよろしくお願いします。
問題が起きるところを再現します。
(1) テキスト入力フィールドに文を書いて、「submit」を押す
(2) 掲示板に書き込まれて、テキスト入力フィールドは空欄になる
(3) ブラウザの「再読み込み (更新, Reload)」を押す
(4) w3m0.2.1 では、(1) で書いた内容が書き込まれてしまう
IE5.5, NN4.76 では、注意が表示されて、実行すると (1)
で書いた内容が、掲示板に書き込まれてしまう
Mozilla0.8 では、何も書き込まれない。これは正常。
ブラウザによって、結果が違うものの、友人の作った Perl の
掲示板では、どのようにしても、ただ再表示されるだけで、書き
込まれたり、注意が表示されたりはしません。
きっと僕の Ruby のスクリプトで、テキストを取得するときに
何か処理が足りないのだろうと思っているのですが、それが
分かりません。
書き込み後の再読み込みで、注意が表示されたり、直前の書き込みが
書き込まれたりしないためには、どのようにしたら良いか、ご助言
頂ければ幸いです。よろしくお願いします。
問題のスクリプトを短くしたものを記載します。属性 0777 の
ディレクトリに、このスクリプトを属性 0755、名前 index.cgi
にして置き、ruby へパスを通して頂ければ動きます。
長いメイルになってしまい恐縮ですが、よろしくお願い致します。
#!/usr/bin/ruby
require "cgi"
class Item
def initialize(s_name = "")
@s_name = s_name
end
def get(in_cgi)
@cgi = in_cgi
@s_name = @cgi['name'][0]
end
def put_file(s_logfile)
s_tmpfile = "log_tmp.txt"
begin
File.rename (s_logfile, s_tmpfile)
fl_tmp = open (s_tmpfile, "r")
rescue Errno::ENOENT
fl_tmp = nil
end
fl_log = open (s_logfile, "w")
fl_log.print @s_name, "\n"
fl_tmp.each { |line| fl_log.print line }.close unless fl_tmp == nil
fl_log.close
File.chmod (0666, s_logfile)
end
def write
print "<HR>", @s_name.chop, "\n"
end
end
class BBS
def initialize
@cgi = CGI.new
if @cgi['state'][0] == "written"
my_item = Item.new
my_item.get(@cgi)
my_item.put_file ("log.txt")
end
end
def write_html
print "Content-type: text/html\n\n"
print <<-EOL
<HTML><BODY><H1>BBS</H1><HR>
<FORM method="POST" action="./index.cgi">
<INPUT type="hidden" name="state" value="written">
Content<INPUT type="text" name="name">
<INPUT type="submit" value="submit">
</FORM>
EOL
File.foreach("log.txt") do |log_line|
Item.new(log_line).write
end
print "</BODY></HTML>"
end
end
bbs = BBS.new
bbs.write_html
______________________________________________________
/ ______/
/ 三上 雅人 - 英語表記も姓名順です _____/
/ Mikami Masato - ↓移転 8/15 ____/
/ 興 風 館 - http://kofukan.nmn.jp/ ___/