3 日坊主日記
2005-03-08 [長年日記]
_ [Apollo] for Delphi 2005
http://wiki.fdiary.net/apollo/?MakingApolloDelphi2005
Apollo の範囲では Delphi6 との互換性はあるらしい。
_ [Rails] Eleven
RoR で書いてみました。みかけだけ。^^;
- foo_controller.rb:
require 'eleven'
class FooController < ApplicationController
include Eleven
statesafe :first, :last
display {
print "Please enter your name."
edit "First name: ", @first
edit "Last name: ", @last
}
display {
print "Thank you, ", @first, " ", @last, "."
}
end
- helper/eleven.rb:
module Eleven
def self.append_features(base)
super
base.extend(ClassMethods)
end
class SS
def initialize(name, value)
@name = name
@value = value
end
attr_accessor :name, :value
end
DISP_PROCS = []
module ClassMethods
def statesafe(*varnames)
stmt = varnames.map {|varname|
%[ @#{varname} = SS.new("#{varname}", @session["#{varname}"]) ]
}
module_eval <<-"end_eval", __FILE__, __LINE__
def _statesafe
#{stmt.join("\n")}
end
end_eval
end
def display(&b)
DISP_PROCS.push b
end
end
def index
disp
end
def disp
@params["ss"] && @params["ss"].each {|name, value|
@session[name] = value
}
_statesafe
disp_id = @params["id"].to_i
@html = <<EOT
<form action="/foo/disp/#{disp_id+1}" method="post">
EOT
self.instance_eval &DISP_PROCS[disp_id]
@html << <<EOT
<input type="submit" value="Continue">
<input type="button" value="Logout">
</form>
EOT
render_text @html
end
def h(str)
CGI.escapeHTML(str)
end
private :h
def print(*opts)
@html << "<p>"
opts.each {|opt|
case opt
when String
@html << h(opt)
when SS
@html << h(opt.value.to_s)
end
}
@html << "</p>"
end
def edit(caption, ss)
@html << "<p>"
@html << h(caption)
@html << %[<input type="text" name="ss[#{h ss.name}]" value="#{h ss.value}">]
@html << "</p>"
end
end
ActionController しか使ってないから RoR ぽくない。
ActionView だと入れ子が書きにくいので展開してしまったけど、Amrita だとそのまんまなのかもしれない。
[ツッコミを入れる]
[]