在 Ruby on Rails 開發中,產生 XML 文件是常見需求。Rails 透過 Builder Gem 提供了強大且直觀的 XML 產生機制。本文將完整示範從環境建置、資料庫設定、Model 遷移、Controller 邏輯到 View 樣板的完整流程,教您如何從 MySQL 資料庫讀取資料並輸出結構化的 XML 文件。
首先確保已安裝 Ruby、RubyGems 與 Rails。在 Windows 環境下,可下載 Ruby Installer(建議 1.8.5 以上版本),安裝時勾選 RubyGems。接著透過指令安裝 Rails 及相依套件:
c:/ruby> gem install rails --include-dependencies
安裝 Builder Gem:
C:/ruby> gem install builder
Builder 提供 Builder::XmlMarkup 類別,支援 CDATA、註解、宣告、處理指示等 XML 結構產生方法,表列如下:
| 方法 | 說明 |
|---|---|
cdata!(text) | 新增 CDATA 區段 |
comment!(comment_text) | 新增註解 |
declare!(inst, *args, &block) | 新增宣告,支援多參數 |
instruct!(directive_tag=:xml, attrs={}) | 新增處理指示,屬性以 Hash 指定 |
new(options={}) | 建立 XML 標記 Builder 物件,可設 target、indent、margin |
target!() | 回傳 Builder 物件的目標輸出對象 |
安裝 MySQL 5.0 並建立服務實例。建立新 Rails 專案:
C:/ruby> rails databasexml
修改 config/database.yml 設定開發環境資料庫連線:
development:
adapter: mysql
database: test
username: root
password:
host: localhost
產生 Catalog Model 及 Migration:
C:\ruby\databasexml> ruby script/generate model catalog
編輯 db/migrate/001_create_catalogs.rb,定義欄位並植入種子資料:
class CreateCatalogs < ActiveRecord::Migration
def self.up
create_table :catalogs do |t|
t.column :journal, :string, :limit => 255
t.column :publisher, :string, :limit => 255
t.column :edition, :string, :limit => 255
t.column :title, :string, :limit => 255
t.column :author, :string, :limit => 255
end
Catalog.create :journal => "IBM developerWorks",
:publisher => "IBM", :edition => "October 2005",
:title => "JAXP validation", :author => "Brett McLaughlin"
Catalog.create :journal => "IBM developerWorks",
:publisher => "IBM", :edition => "July 2006",
:title => "The Java XPath API", :author => "Elliotte Rusty Harold"
end
def self.down
drop_table :catalogs
end
end
執行遷移:
C:/ruby/databasexml> rake migrate
產生 Controller 與 gen_xml Action:
C:/ruby/databasexml> ruby script/generate controller catalog gen_xml
修改 app/models/catalog.rb 設定資料表名稱與資料庫連線:
require 'active_record'
class Catalog < ActiveRecord::Base
set_table_name "catalogs"
end
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "root",
:password => nil,
:database => "test"
)
編輯 app/controllers/catalog_controller.rb:
class CatalogController < ApplicationController
def gen_xml
@xml = Builder::XmlMarkup.new
@catalogs = Catalog.find(:all)
end
end
將 views/catalog/gen_xml.rhtml 重命名為 gen_xml.rxml,撰寫 XML 產生邏輯:
@xml.instruct! :xml, :version=>"1.0"
@xml.catalogs {
for catalog in @catalogs
@xml.catalog do
@xml.journal(catalog.journal)
@xml.publisher(catalog.publisher)
@xml.edition(catalog.edition)
@xml.title(catalog.title)
@xml.author(catalog.author)
end
end
}
啟動 WEBrick 伺服器:
C:/ruby/databasexml> ruby script/server
瀏覽 https://localhost:3000/catalog/gen_xml 即可看到產生的 XML 文件,如下圖所示:

圖 1:從資料庫產生 XML 文件的執行結果
透過 Builder Gem 與 Rails 內建的 MVC 架構,我們能以極少的程式碼完成資料庫到 XML 的轉換。Builder::XmlMarkup 提供直觀的區塊語法,讓 XML 結構產生如同撰寫 Ruby 程式碼般自然。這個範例展示了 Rails 「慣例優於設定」的哲學,讓開發者專注於業務邏輯而非繁瑣的 XML 字串拼接。