Wednesday, July 13, 2005

Request xml output from rails

วันนี้ได้ทดลองเขียน rails ให้ response เป็น xml content
สรุปวิธีการได้ดังนี้

โจทย์
เราจะลองสร้าง web application ที่ provide
ข้อมูล contact ให้กับผู้ร้องขอ โดยให้ format
กลับมาเป็น xml

  • สร้าง application
    โดยใช้คำสั่ง
    rails contactApp

    ซึ่งเป็นการสร้าง framework structure ขึ้นใน
    directory contactApp

  • สร้าง controller สำหรับรับ request

    ให้ cd ไปยัง directory contactApp ที่ rails generate ให้
    จากนั้นสั่งสร้าง controller
    ruby script/generate controller xml

    จะได้ file xml_controller.rb ใน directory app/controllers

  • implement action
    ในที่นี้จะลองสร้าง action ที่ชื่อ list
    ซึ่งทำหน้าที่แสดงรายการ contact ทั้งหมดกลับไปในรูป xml
    class XmlController < ApplicationController
    def list
    @contacts = Contact.find_all
    @headers["Content-Type"] = "text/xml; charset=utf-8"
    render :action=>'list', :layout => false
    end
    end

    step การทำงานก็คือ select ข้อมูล
    ทั้งหมดของ contact ขึ้นมาจาก database
    ใส่ไว้ใน class attribute ที่ชื่อ contacts

    จากนั้นก็ set content-type ของ response
    ให้เป็น text/xml

    สุดท้ายก็ dispatch ไป render โดยใช้ view ที่ชื่อ list
    โดยระบุไม่ให้ layout component ทำงาน
    (layout จะทำหน้าที่ generate ส่วนที่
    ใช้ซ้ำๆกันใน view เช่น พวก header, footer
    ของ page)

  • สร้าง view ที่ชื่อ list.rxml
    สังเกตุว่านามสกุลเป็น rxml เนื่องเป็น
    template ที่ช่วยในการ generate xml
    (template นี้ใช้ builder module
    ในการ generate xml)

    ภายใน list.rxml มีเนื้อหาดังนี้
    xml.instruct! :xml, :version=>"1.0"
    xml.contacts do
    @contacts.each do |contact|
    xml.contact(:name=>contact.name, :email=>contact.email)
    end
    end



ทดลองเรียกใช้งาน
โดยส่ง request ไปยัง url "http://host:port/xml/list"
(เป็นการเรียกใช้ action list ที่อยู่ใน xml controller)
ผลลัพท์ที่ได้
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
<contact name="polawat phetra" Email="pphetra@x.hotmail.com"/>
<contact name="prapapan phetra" Email="cprapapan@y.yahoo.com"/>
<contact name="pann phetra" Email="pann@pokhome.com"/>
</contacts>

Related link from Roti

No comments: