Hatena::ブログ(Diary)

今日とは違う明日 このページをアンテナに追加 RSSフィード Twitter

2008-02-12

Rails2.0とXHTMLとXMLHttpRquest.responseXML

Railsで色々処理して結果をXHTMLで返すアプリを作ったのです。で、使い勝手とかあんまり意識してないので、jQueryを使ってUI部分を1階層ラップしたい。具体的には、jQuery.ajax()のXMLHttpRequest.responseXMLでレンダリングされたXHTMLを受け取ってぐりぐり弄りたい、と。

が、responseXMLがどうもnullってるのです。Operaだとnullってない。MacFirefoxSafariはnullってる。

調べた結果、Content-Typeがtext/hmtlだと普通はresponseXMLにいれないらしい。Operaが特殊らしい。っていうか、このケースだとContent-Typeを無視してやがるっぽい。で、どうやらtext/xmlとかapplication/xmlを返せばどうにかなるっぽいことが分かる。


ああ、respond_toのformat.xmlを使えばいけそうね、と思う。が、わざわざhoge.xml.erbを作るのはいやだ。っていうか、結果自体はいま作ってあるXHTMLレンダリングされたものが欲しいのだよ。

で、こうしてみた。

respond_to do |format|
  format.html
  format.xml  { render :template => "foos/bar.html.erb", :layout => "foos.html.erb" }
end

これならContent-Typeがapplication/xmlになってresponseXMLで受け取れるみたい。↓みたいなことができた。

jQuery.ajax({
  type: "GET",
  url...
  ...
  complete: function(xmlHttpReq) {
    $("#hoge", xmlHttpReq.responseXML).appendTo("#output");
  }
});

・・・と思ったらInternet Explorerで動かねぇ。くそぅ。


追記。

IEXMLHttpRequestオブジェクトのresponseXMLプロパティの値は、Content-Typeが"text/xml"ではない場合にはnullになります。

Ajaxの長所・短所・実装に関するメモ (暫定版) 【▲→川俣晶の縁側→ソフトウェア→技術雑記】

という記述を見つける。んー・・・app/controller/application.rbにFilterを追加してみる。

after_filter :set_content_type

def set_content_type
  if request.user_agent.include? "MSIE"
    unless headers["Content-Type"].nil?
      headers["Content-Type"] = "text/xml; charset=utf-8" if headers["Content-Type"].include? "application/xml"
    end
  end
end

で、jQuery

alert(xmlHttpReq.getResponseHeader("Content-Type"));

ってやると"text/xml; charset=utf-8"と表示されるのだけど、相変わらずresponseXMLはダメっぽ。responseTextにはちゃんと入ってきてるんだけどなぁ。

症状的にはresponseXMLでのXMLデータ取得 − Java Solution − @ITと同じっぽいが。


追記2

jQueryprototype.jsに変更しても、症状は同じ。XHTMLがおかしいのかな。。。


追記3

[JavaScript]responseXMLではまった / LiosK-free Blog

こちらのサイトがresponseXMLの扱いについてよく纏まっていて助かりました。結局の所、結論は「つかえねぇw」ですが。orz

responseTextで頑張るか、json化するか。いっそのことFlash・・・。

現実はイメージしたことの若干斜め上に

なんだろうな〜。最近感じるのは、以前、目標として思い描いたイメージがあって、基本的な方向は変わらないんだけど、想定していた状態の斜め上くらいの現実になって目の前に現れるもんだな〜。

と、思った。

「で、」が使えないと不便だ・・・

このブログの文章で、よく「で、」という言葉をつけて、無理やり文章を繋げたりすることがあるのです。「で、」って便利なんだよな〜。

で、困ったことがあって、会社向けの文章だとこれが使えない。さすがに使えない。困る。書きづらい。

つまりこれは、自分の文章力の無さに直面しているということだろうなw

検索エンジンに欲しいもの

百度は中国で受け入れられている自然語検索機能を充実させて『当てる検索』を狙います」という。

百度の“二番手でいい”戦略は日本で成功するのか?|デジタル流行通信 戸田覚|ダイヤモンド・オンライン

そう、自然言語検索は欲しい。キーワードの上手い組み合わせを考えなきゃいけないとき、どれほど文章で質問できたら、と思ったことか。

あと欲しいものがもう一つ。言語の壁を越えること。例えば、日本語で検索したときに、英語のキーワードに変換して英語圏を検索し、更に検索結果を日本語に翻訳しなおして表示してくれる!なんという夢物語

連想検索で本を探す@ジュンク堂

文章の類似性に基づき連想によって検索するので、店頭での単語検索と違って漠然としたテーマやイメージで調べられる。

ジュンク堂書店は連想で思わぬ本の購入を決めてくれるメリットを勘案、試験的に導入した。

asahi.com:ジュンク堂書店池袋本店、“連想検索”で本を探すシステム導入 - 日刊工業新聞ニュース - デジタル

へ〜、面白い。

Amazonの「この商品を買った人はこんな商品も買っています」とはまた違ったアプローチだな〜。どの程度、嗜好にマッチするもんか試してみたいけど、ジュンク堂が近くにないw

池袋は遠すぎじゃ。

創造性以外のものは簡単に手に入る、か

羽生は最後におそろしいことを言っている。

創造性以外のものは簡単に手に入る時代だとも言えるでしょう。

現代将棋が表現する思想 - My Life Between Silicon Valley and Japan

なるほど、と思った。

というのは、ちょうど今読んでいる本から得た印象が、それと似たようなものだったからだろうか。「その数学が戦略を決める」という本なのだが、この本の趣旨は膨大なデータを分析することで、専門家より精度の高い判断ができるようになっている、というものだ(それだけではないのだけど)。

ワインの品質予測も、医療判断も、膨大なデータと分析対象の数値を組み合わせることで、精度の高い結果を得ることができるらしい。まさに、「創造性以外」のものは簡単に手に入る時代になりつつあるし、一部では実際にそうなっているな、と。

膨大なデータを使って専門家に近い判断を素人が出来るようになる時代であり、創造性をもって新しい事例を生み出すことがより価値を持つ時代、か。


追記

「膨大なデータを如何に効率的かつ効果的に扱える」スキルを持つことで、ようやくスタートラインに並べるってことか(高速道路で走れる)。でも、それだけでは「その他大勢」でしかなくって、そっから抜け出すために「如何に創造的な成果を生み出せるか」が要求されるのだろうけど、一方で、それはどこかで「高速道路」を降りて全く違う道を辿ることで実現するのではないか、という気もした。

高速道路に乗るべき時と、高速道路から降りて独自の道を探すべき時、ってのがあるんかな〜。