ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「RailsによるアジャイルWebアプリケーション開発」12章まで読了

/info/who_bought/6 → HTML
/info/who_bought/6.xmlXML
/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)には何も書いてありませんでした。。