HTML以外のレスポンス

要するに、XMLやJSONでのレスポンスですね。

  • 単にモデルの結果をXMLで返すだけなら、renderで:xmlを指定するだけでOK!
     def get_xml
       books = Book.all
       render :xml => books
     end
    
    • JSONも同じ
       def get_json
         books = Book.all
         render :json => books
       end
      
    • 直接、文字列指定等もできるよ。
       def get_xml_text
         render :xml => '<error>エラー発生</error>'
       end
       def get_json_text
         render :json => { :data1 => 'データ1', :data2 => ['データ2-1','データ2-2']}
       end
      
      • んー、本だと日本語がそのままみたいだけど、ウチではエンコードされてる?まあいっか。
  • テンプレートを使ってXMLを書くなら、respond_toメソッドで!
    • まずはコントローラ(ontrollers/ctrl_controller.rb)に、以下のメソッドを書く
       def xml_erb
         @book = Book.find(params[:id])
         respond_to do |format|
           format.xml
         end
       end
      
    • で、以下のテンプレート(views/ctrl/xml_erb.xml.erb)を作って、
      <?xml version="1.9" encoding="utf-8" ?>
      <book isbn="<%= @book.isbn %>">
        <title><%= @book.title %></title>
        <price><%= @book.price %></price>
        <publish><%= @book.publish %></publish>
      </book>
      
    • URL的には、「http://localhost:3000/ctrl/xml_erb/1.xml」にアクセスすれば、ERBを使ったXMLが返ると。
    • respond_toは、他にも「html/json/rss/atom/yaml/text/js/css/csv/ics」が定義済み
      • この定義は、以下のRailsのライブラリで定義済み(これは環境によって違うので注意!)
        C:\Ruby192\lib\ruby\gems\1.9.1\gems\actionpack-3.1.0\lib\action_dispatch\http\mime_types.rb
        
      • で、自分でフォーマットを追加したい場合は、「config/initializers/mime_types.rb」に追加ね!
        Mime::Type.register "text/richtext", :rtf
        
    • と、いうか、このrespond_toって、どうやって動いているのか…。なので、ちょっと調べてみた。
  • おおー、Rails3だと、respond_withでテンプレート毎の記述が省略できるみたい
    • もともとこう書いてあったところを、
       def index
         @books = Book.all
         respond_to do |format|
           format.html # index.html.erb
           format.json { render json: @books }
         end
       end
      
    • こういうふうに、書けるみたい!イカス!
       respond_to :html,:json
       def index
         @books = Book.all
         respond_with @books
       end
      
  • XML出力時に、Builderを使ってRuby書式でも書けるんだ!
    • まず、こんなファイル(views/ctrl/xml_erb.xml.builder)を作って、
      xml.book(:isbn => @book.isbn) do
        xml.title(@book.title)
        xml.price(@book.price)
        xml.publish(@book.publish)
      end
      
    • さっき作った「views/ctrl/xml_erb.xml.erb」を別名に変えてから、
      • 基本、erbが優先されるから、別名に変えないとBuilderが有効にならないんだねー
    • http://localhost:3000/ctrl/xml_erb/1.xml」にアクセスすれば、Builderを使ったXMLが返ると。
    • まあ、Builderは、単に「xml.エレメント」みたいアクセスするRubyスクリプトなんで、いろいろできそうだね。
  • ビューヘルパーとかを使うと、XML出力の整形も簡単!この例はatom出力の例だね!
    • まずは、atom形式の返却を、コントローラ(controllers/books_controller.rb)に追加
       respond_to :html,:json,:atom
      
    • で、こんなBuilderのビューファイル(views/books/index.atom.builder)を作成して、
      atom_feed do |feed|
       feed.title('最新書籍情報')
       feed.updated(@books.last.created_at)
      
       @books.each do |book|
         feed.entry(book,
           :url => "http://www.hmv.co.jp/search/?target=BOOKSISBN&catnum=#{book.isbn}",
           :published => book.published,
           :updated => book.published) do |entry|
           entry.title(book.title)
           entry.content("#{book.publish}刊 #{book.price}円")
           entry.author do |author|
             author.name(book.authors[0].name)
           end
         end
       end
      end
      
    • FireFoxで、「http://localhost:3000/books.atom」にアクセスすれば、atomが整形されてきれいに見れたし、URLクリックで検索もOK
    • ここでは、atom_feedメソッドがビューヘルパーで、その下にtitle/updated/entryとかがある感じね。
-
最終更新:2012年01月05日 07:01