RailsとREXMLでRESTっぽいものを作る

REXMLはRubyの中では一番メジャーなXML用のライブラリらしい。
さっそく作ったが、いろいろひっかかるところがあった。
ソースは以下のような感じだが、一部変な書き方をしているが、
これは、こう書かないと動かないのである。

  • 呼び出し側
<%= start_form_tag({ :action => 'hello' }, { :method => 'get' }) %>
    <input type='text' name='name' value="" />
  <%= submit_tag "Search" %>
<%= end_form_tag %>
  • 呼び出され側
  def hello
    if @params[:name] != nil

      name = @params[:name]

      doc = REXML::Document.new

      e_input = REXML::Element.new "input"
      e_input.add_attribute "name", name

      e_output = REXML::Element.new "output"
      e_output.add_attribute "answer", "Hello " + name + " !"

      e_method = REXML::Element.new "method"
      e_method.add_attribute "name", "hello"
      e_method.add(e_input)
      e_method.add(e_output)

      e_resp = REXML::Element.new "resp"
      e_resp.add(e_method)

      doc.add(e_resp)

      @xml = ""
      decl = REXML::XMLDecl.new "1.0", "UTF-8", nil
      decl.write(@xml, 0)
      doc.write(@xml, 1)

      render :leyout => false, :xml => @xml
    end
  end