created at 2011-12-11 11:19:16 UTC
Rails の Ajax は過渡的なもので注意が必要だ
この記事は Ruby Advent Calendar 2011 の 11 日目の記事です。真面目な話を書く。
Ruby プログラマーの皆様にあっては Rails プログラマーの方が多くいらっしゃると思います。 Rails を用いて開発されるプログラムには悉く Ajax が使用されていることでしょう。
つまり Ruby プログラマの多くは JavaScript プログラマです。
ところで Ruby と JavaScript はその思想に多きな差異があります。 JavaScript はその隅々においてコールバック制御を用いたシングルスレッドのイベントドリブンなプログラミングを要求します。
実際こうしたイベントドリブンなプログラミングは大層難しく、 Rails ではそれを隠蔽する為の仕組みが提供されています。御存知 link_to や form_tag のオプション remote: true です。
remote: true にあっては呼び出し先の action で js.erb を用いて動的に js を返却することで処理を行ないます。こうした処理の流れは直線的で、 Ruby プログラマには大変分かりやすいというところがあります。
ところが js の動的な生成にはパフォーマンス上の問題があります。またセキュリティ上の問題を発生させることも多々あります(これについては詳述を控えます)。実際に remote: true に端を処すると思われる XSS をこれまでに何件か発見しています。
また Rails 3.1 では assets pipeline が導入され js は原則的に app/assets/javascrupts 以下に coffeescript で記述されることとなりましたが、 js.erb はこの流れにも反しています。
以上のようなあらゆる理由により js.erb を使用することは控えるべきです。 js には js のルールがあり無理に Ruby や Rails のルールでやろうとすることに重大な問題があると考えるべきです。
幸いなことに remote: true には js のルールであるコールバック制御によるイベントドリブンなプログラミングを行なう為の機構が用意されています。 remote: true で ajax を行なう場合
といったイベントが発火します。こうしたイベントに対して jQuery の on() でコールバックを設定しましょう。
JavaScript を用いたプログラミングは実際複雑ですが、 UI を作るというのは本来そういうことです。現状ではその複雑さを甘受することが、セキュリティリスクがなく高速なアプリケーションを作成する為には必要です。
この記事に特にオチは無い。