Ruby で掲示板の CGI を作る #2

前回作った掲示板をリファクタリングした。主な改善点は

  • BBS クラスと Post クラスに分けた。
  • ActiveRecord を使った。
  • 設定ファイルを作った。

bbs.rb

#!/usr/bin/ruby -Ku
require 'rubygems'
require 'erb'
require 'cgi'
require 'config'
require 'lib/post'
class BBS
#constructor
def initialize
@cgi = CGI.new
@url = "http://#{ENV['SERVER_NAME']}#{ENV['REQUEST_URI']}"
if self.save_new_post
puts @cgi.header({"status" => "302 Found", "Location" => @url})
else
begin
@posts = Post.find(:all, {:order => "date desc"})
self.render
rescue
self.render_error
end
end
end
#save new post
def save_new_post
params = @cgi.params
if @cgi.request_method == "POST"
return  Post.new(:name => params["name"][0].untaint, :content => params["content"][0].untaint, :date => Time.new).save
end
return false
end
#render view html
def render
puts @cgi.header({"content-type" => "text/html", "charset" => "utf-8"})
@erb = ERB.new(File.read($TEMPLATE_PATH).untaint, 1)
puts @erb.result(binding)
end
#render error html
def render_error
puts @cgi.header({"content-type" => "text/html", "charset" => "utf-8"})
puts "error"
exit
end
end
#execute
BBS.new

post.rb

#!/usr/bin/ruby -Ku
class Post < ActiveRecord::Base
validates_presence_of(:name, :content)
validates_length_of(:name, :maximum => 40)
validates_length_of(:content, :maximum => 200)
end

config.rb

#!/usr/bin/ruby -Ku
require 'rubygems'
require 'active_record'
$TEMPLATE_PATH = "tmpl/template.rhtml"
ActiveRecord::Base.establish_connection (
:adapter => "mysql",
:host => "localhost",
:username => "rubybbsuser",
:password => "rubybbs1234",
:database => "rubybbs"
)

気づいた点など

  • ActiveRecord が非常に便利。
  • mod_ruby を使う場合、ライブラリの修正時に Apache を再起動する必要がある。

ソースコード

/repos/public/ruby/bbs/