「RailsによるアジャイルWebアプリケーション開発」12章まで読了
/info/who_bought/6 → HTML
/info/who_bought/6.xml → XML
/info/who_bought/6.html → HTML
おぉー!RESTfulっぽいよ。
これをやるには、config/routs.rbに
map.connect ':controller/:action/:id.:format'
みたいな設定が必要なようなのですが、Rails2.0ではデフォルトで設定されてました。
というわけで、自由課題。
クライアントがXMLレスポンスをリクエストしたときにはXMLの商品カタログを返すように、元のカタログ表示を変更してみましょう。
まずは、store_controller.rbのindexメソッドに以下を追加。
respond_to do |format| format.html format.xml end
でもって、app/views/store/index.rxmlを追加。
xml.product_list do for product in @products xml.product(:id => product.id) do xml.title(product.title) xml.description(product.description) xml.price(product.price) end end end
これで動くかと思いきや、
Routing Error No route matches "/store/index.xml" with {:method=>:get}
エラー発生。
config/routes.rbに以下を追加。
map.connect ':controller/:action.:format'
これで無事
http://localhost:3000/store/index.xml
にアクセスしてxmlも表示できるようになりました。
rxmlテンプレートを使って通常のHTML(XHTML)レスポンスを生成してください。
どのような利点と欠点があるかについても考えてみましょう。
試しに、login#list_usersをxml化することを思いつく。
とりあえずapp/controllers/login_controller.rbのlist_usersメソッドに以下を追加
respond_to do |format| format.html format.xml {render(:layout => false)} end
※後で発覚したのだが、レイアウト(products.xml.erb)がないとか怒られるので、xmlの場合はレイアウトなしの指定にしてある。
でもって、views/login/list_users.rxmlを作る。
xml.ul do for user in @all_users xml.li(:id => user.id) do xml.text!(user.name) end end end
これで、
/login/list_users.xml
にアクセスすると、一応できてるっぽい。
こういう風にする利点は、HTMLでそのまま表示できる、かつ、いわゆる整形式になっているためにプログラムから扱いやすいという両面を備えることができるということでしょう。つまり、ブラウザとWebサービスクライアントの両方を一度にサポートできるという点ですね。まさにXHTMLの利点そのままって感じもしますが。
欠点って何かあるのかな?
erbよりrxmlの方が書きづらいってところかなあ。
プログラムによってHTMLレスポンスを生成する場合は、Markabyについて調べてみましょう。
これ
http://redhanded.hobix.com/inspect/markabyForRails.html
のことらしい。
rxmlに似た感じの構文で書けるってことですかね。
Jakarta ECSを思い出しましたよ。
http://jakarta.apache.org/ecs/index.html
クレジットカードとPayPalの処理、フルフィルメント、クーポン券の発行、RSSのサポート、ユーザアカウント、コンテンツ管理などをDepotアプリケーションに追加してみてください。
うーん、だいぶ投げやりな感じじゃないか?(汗
RSSサポートはやってみる価値あるかも。もうちょい先に進んでからやるかも。やらないかも。
ちなみに、ヒント(http://pragprog.wikidot.com/task-g-one-last-wafer-thin-change)には何も書いてありませんでした。。