[Ruby] SimpleConsole の View を外部ファイルで管理して puts-less に。

by tanabe on March 31, 2007

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

SimpleConsole の以前の紹介記事はこちら