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

April 28, 2008category: Ruby 

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

  • 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/

comments (0)