SimpleConsole で View にいちいち puts とか print とか書くのがめんどい。余計な出力は見せないのが Unix way なのだろうけど、それにしても help とか書くときに puts が並んだのを見るとうんざりする。(ちなみにヒアドキュメントはあまり好かない。)
てことで、Rails の ActionView みたいに外部ファイルのテンプレート読み込んでやればいいんじゃない?とありがちな結論に持ってってみた。
下記のようなオフィシャルサイトのサンプルコードが、
class Controller < SimpleConsole::Controller params :string => {:n => :name} def whoami @name = params[:name] end # ... end class View < SimpleConsole::View def whoami puts "Hello, your name is " + @name end end
こうなる。当然コントローラでセットしたインスタンス変数の値はテンプレートから参照可能。
class Controller < SimpleConsole::Controller params :string => {:n => :name} def whoami @name = params[:name] end # ... end require 'view_template' class View < SimpleConsole::View def_view_template :whoami end # .. inside whoami.rview Hello, your name is <%= @name %>
ViewTemplate Module はこんなかんじ。テンプレートファイルはとりあえず実行するファイルと同じところに置いておけば動くようになってるけど、今いちなかんじ。どんな構成にするのがいいかなぁ。あんまり大層な構成にしても SimpleConsole らしくないし。
require 'erb' require 'simpleconsole' module ViewTemplate include ERB::DefMethod TEMPLATE_FILE_EXTENSION = '.rview' TEMPLATE_METHOD_NAME_PREFIX = 'erb_' def def_view_template(*method_names) method_names.each {|name| define_view_method(name) } end def define_view_method(method_name) template_file_name = method_name.to_s + TEMPLATE_FILE_EXTENSION template_caller = TEMPLATE_METHOD_NAME_PREFIX + method_name.to_s module_eval %Q- def_erb_method("#{template_caller}", "#{template_file_name}") def #{method_name} puts #{template_caller} end - end private :define_view_method end SimpleConsole::View.extend ViewTemplate