※このエントリは、(多分)間違っていませんが非推奨です。
生の JavaScript を出力したい場合は page << 'script' を使用しましょう。
try & error だけで何とかしようとせず、基本的な事ぐらい調べましょうという自戒を込めて、そのままにしてあります。
Rails には RJS という機能があり、AJAX 通信時に ruby のソースから JavaScript を生成してレスポンスとして返す事ができる。
そのうちの機能の一つに、page.call がある。
page とは、画面というかドキュメントを表すオブジェクトで、JavaScript でいう document オブジェクトみたいなもの。
page.call は引数の関数を実行してくれる。
たとえば、page.call 'hoge' となっていた場合、実際のブラウザ上では hoge(); が実行される。
また、関数に引数を渡すこともでき、page.call 'alert', 'foo' とすると、alert("foo"); が実行される。
複数引数にも対応しており、page.call 'alert', 'foo', 'bar' とすると、alert("foo", "bar"); が実行される(この例だと意味ないけど)
第一引数に指定された名前の関数を実行するだけの page.call だが、仕組みとしては (); を付け加えてレスポンスに流すだけである。
なので、page.call '(function() {if(confirm("ok?")){alert("hoge");}})' とすれば、(function() {if(confirm("ok?")){alert("hoge");}})(); という無名関数の実行ができる。
要するに、どんな JavaScript も実行できるということになる。
ちなみに、page.call 'eval', 'if(confirm("ok?")){alert("hoge");}' としても同じ事ができる。
また、第二引数以降は全て文字列として渡される。その際、" で囲まれるのだが、文字列内に " が含まれていても、ちゃんとエスケープしてくれるので安心である。
これを使えばどういう事ができるかというと、私はよく編集パネルのポップアップなんかで使う。
のような感じ。(これは、jRails で jQuery を利用した例だけど)
あとは、サーバー側で検証を行い、確認のダイアログを出して ok なら再度通信する。という(割とよくある)パターンにも利用できる。
簡単なサンプルを作ってみた
以下、サンプルのソース。
<!-- app/views/rjs_page_call/index.html.erb -->
<% form_remote_tag :url => { :action => :test } do %>
<%= hidden_field_tag :confirmed %>
<%= submit_tag :ok, :style => 'width: 60px', :id => 'ok' %>
<% end -%>