Rails アジャイル本 第12章 タスクG:最後のちょっとした変更

XMLレスポンスで商品カタログ配信

store コントローラの index メソッドで XML レスポンスを返すように変更する。
app/controllers/store_controller.rb の index メソッド の respond_to ブロック内で format.xml により XML レスポンスを返させる。

respond_to do |format|
  format.html
  format.xml { render :layout => false }
end

Builder テンプレート (app/views/store/index.xml.builder) で XML を生成させる。

xml.products_list do
  @products.each do |pdt|
    xml.product do
      xml.title(pdt.title)
      xml.description(pdt.description)
      xml.image_url(pdt.image_url)
      xml.price(pdt.price)
    end
  end
end

拡張子 .xml でも XML レスポンスを返すようにするために、ルートを設定する。

config/routes.rb

map.connect ':controller.:format'

Builder テンプレートで XHTML を生成

上記 index.xml.builder テンプレートを XHTML を出力するように修正する。
コードは省略。

こういうのは、プログラマはハッピーかもしれないが、デザイナはアンハッピーじゃないかな。

Markaby を使って HTML レスポンスを生成

markaby を探してみると Rails 2.3.2 に対応したものを発見。
Markaby and Rails 2.3.2 – danielinsley.com
git リポジトリからインストールする。

$ ruby script/plugin install git://github.com/dinsley/markaby.git

インストール後サーバを再起動しないとプラグインを使えなかった。

いろいろサイトを探して、使い方を調べてみる。

store のテンプレート・レイアウトを Markaby で出力してみる。
app/views/layout/store.html.erb の代りに app/views/layout/store.mab を作成する。

html do
  head do
    title "Pragmatic Books Online Store"
    stylesheet_link_tag "depot", :media => "all"
    javascript_include_tag :defaults
  end

  body.store! do
    div.banner! do
      image_tag("logo.png")
      if @page_title
        span @page_title
      else
        span "Pragmatic Bookshelf"
      end
    end

    div.columns! do
      div.side! do
        if @cart
          hidden_div_if(@cart.items.empty?, :id => "cart") do
            render :partial => "cart", :object => @cart
          end
        end
        link_to 'ホーム', :controller => :store, :action => :index
        br
        link_to 'よくある質問', :controller => :faq
        br
        link_to 'ニュース', :controller => :news
        br
        link_to 'お問い合わせ', :controller => :contact
        br
        tag! :span, :class => "page-created-time" do
          @page_created_time
        end
        br

        if session[:user_id] or User.count.zero?
          br
          link_to 'Order', :controller => 'orders'
          br
          link_to 'Product', :controller => 'products'
          br
          link_to 'User', :controller => 'users'
          br
          br
          link_to 'Logout', :controller => 'admin', :action => 'logout'
        end
      end

      div.main! do
        if flash[:notice]
          div.notice! do
            flash[:notice]
          end
        end
        self << content_for_layout
      end
    end
  end
end

これも、デザイナには嬉しくないだろうな。

同様のプラグインに Haml っていうのもあるらしい。

Unspace – Haml: HTML Abstraction Markup Language

RailsによるアジャイルWebアプリケーション開発
Sam Ruby David Heinemeier Hansson Dave Thomas
オーム社
売り上げランキング: 29946
«
»