· 8 years ago · Mar 11, 2018, 08:18 PM
1require 'rubygems'
2require 'rack'
3require 'activerecord'
4require 'erb'
5
6class LineBbs
7 include ERB::Util
8
9 def call(env)
10 request = Rack::Request.new(env)
11 case
12 when request.get?
13 response = get(request)
14 when request.post?
15 response = post(request)
16 else
17 response = Rack::Response.new{|res|
18 res['Content-Type']= 'text/html;charset=utf-8'
19 res.status = '405'
20 res.write "405 not allowed\n"
21 }
22 end
23 response.finish
24 end
25
26 def get(request)
27 comments = Comment.all(:order => "id DESC")
28 Rack::Response.new{|res|
29 res['Content-Type']= 'text/html;charset=utf-8'
30 res.status = '200'
31 res.write ERB.new(::TEMPLATE, nil, '-').result(binding)
32 }
33 end
34
35 def post(request)
36 Comment.new{|c|
37 c.name = request.params['name']
38 c.comment = request.params['comment']
39 }.save!
40 Rack::Response.new{|res|
41 res['Content-Type']= 'text/html;charset=utf-8'
42 res.status = '302'
43 res['Location'] = "#{request.scheme}://#{request.host}:#{request.port}/"
44 }
45 end
46end
47
48ActiveRecord::Base.establish_connection(
49 :adapter => 'sqlite3',
50 :database => 'linebbs.sqlite3'
51)
52ActiveRecord::Base.logger = Logger.new(STDERR)
53ActiveRecord::Base.connection.execute <<SQL
54CREATE TABLE IF NOT EXISTS "comments" (
55 "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
56 "name" varchar(255) DEFAULT NULL NULL,
57 "comment" varchar(255) DEFAULT NULL NULL,
58 "created_at" datetime DEFAULT NULL NULL,
59 "updated_at" datetime DEFAULT NULL NULL
60);
61SQL
62
63class Comment < ActiveRecord::Base
64end
65
66TEMPLATE=<<EOD
67<html>
68 <head>
69 <title>LineBBS</title>
70 </head>
71 <body>
72 <h3>LineBBS</h3>
73 <div class="form">
74 <form action="/" method="post">
75 <input type="text" name="name" size="20" /> :
76 <input type="text" name="comment" size="60" />
77 <input type="submit" name="submit" />
78 </form>
79 </div>
80 <hr />
81 <div class="comments">
82 <%- comments.each do |c| -%>
83 <p>
84 <%=h c.created_at.strftime('%Y-%m-%d %H:%M:%S') %> :
85 <%=h c.name %> : <%=h c.comment %>
86 </p>
87 <%- end -%>
88 </div>
89 </body>
90</html>
91EOD
92
93if __FILE__ == $0
94 app = Rack::Builder.new{
95 use Rack::Lint
96 use Rack::ShowExceptions
97 use Rack::Reloader
98 use Rack::CommonLogger
99 use Rack::Static
100 run LineBbs.new
101 }.to_app
102 options = { :Port => 9292, :Host => '0.0.0.0', :AccessLog => [] }
103 Rack::Handler::Mongrel.run(app, options)
104end