Příklad 51.10. FirstDiv.rb
#!/usr/bin/env ruby
# $Id: FirstDiv.rb,v 1.2 2002/09/15 07:21:55 radek Exp $
#
# Copyright (C) 2002 Radek Hnilica
$:.unshift('/home/radek/lib/ruby')
require 'tofu/tofulet'
require 'drb/drb'
def setup_bartender(monolithic=true)
if monolithic
require 'yourapp'
Tofu::Bartender.new(YourTofuSession)
else
DRbObject.new(nil, 'druby://localhost:7642')
end
end
def main(monolithic=true)
DRb.start_service
logger = WEBrick::Log::new($stderr, WEBrick::Log::DEBUG)
s = WEBrick::HTTPServer.new(
:Port => 2001,
:Loger => logger
)
bartender = setup_bartender(monolithic)
s.mount("/div", WEBrick::Tofulet, bartender)
trap("INT") { s.shutdown }
s.start
end
###
main
Příklad 51.11. yourapp.rb
#!/usr/bin/env ruby
# $Id: yourapp.rb,v 1.1 2002/06/07 14:02:21 radek Exp $
require 'div/div'
require 'div/tofusession'
class SumTotal
def initialize
@history = []
@amount = 0
end
attr_reader :history, :amount
def add(value)
f = value.to_f
@history.push(f)
@amount += f
end
def undo
tail = @history.pop
return unless tail
@amount -= tail
end
end
class SumDiv < Div::Div
set_erb('sum.erb')
def initialize(session)
super(session)
@model = SumTotal.new
end
def do_add(context, params)
value, = params['value']
@model.add(value)
end
def do_reset(context, params)
@model = SumTotal.new
end
def do_undo(context, params)
@model.undo
end
end
class BaseDiv < Div::Div
set_erb('base.erb')
def initialize(session)
super(session)
@sum = SumDiv.new(session)
end
end
class YourTofuSession < Div::TofuSession
def initialize(bartender, hint=nil)
super(bartender, hint)
@base = BaseDiv.new(self)
end
def do_GET(context)
update_div(context)
context.res_header('content-type', 'text/html; charset=euc-jp')
context.res_body(@base.to_html(context))
end
end
Příklad 51.12. base.erb
<html>
<head>
<title>First App</title>
</head>
<body>
<h1>First app</h1>
<p><%=h Time.now%></p>
<p><%= @sum.to_div(context) %></p>
</body>
</html>
Příklad 51.13. sum.erb
<%=form('add', context)%>
<table>
<% @model.history.each do |v| %>
<tr><td> </td><td align='right'><%=h v%></td><td> </td></tr>
<% end %>
<tr><th>total</th><th align='right'><%=h @model.amount%></th><td> </td></tr>
<tr>
<th align='right'>add</th>
<th><input size="10" type="text" name="value" value="" /></th>
<th><input type="submit" name="Add" value="Add"/></th>
</tr>
<tr><td align="right" colspan="3"><%=a('undo', {}, context)%>undo</a></td></tr>
<tr><td align="right" colspan="3"><%=a('reset', {}, context)%>reset</a></td></tr>
</table>
</form>
