link_to_remote と respond_to でハマる
例えば、こんなコードを書いてみます。
def index @items = Item.find(:all) respond_to do |format| format.html format.js do # レイアウトは必要ない render :layout => false end end end
そして、ビュー側からこれを呼び出し。
<%= link_to_remote "Test", :url => {:action => "index"} %>
すると、なぜか format.html の方のレスポンスが返されてしまいます。 firebug でレスポンスヘッダを確認すると、確かに text/html が返されてしまっている…
原因が分からず API を読んだりして調べたところ、気になる点を発見。link_to_remote はデフォルトでリンクアクションに post を使ってしまうようです。
ここで行うのは単なる呼び出しなので、 get を使うように先ほどのコードを書き換えます。
<%= link_to_remote "Test", :url => {:action => "index"}, :method => :get %>
これで確認すると、 text/javascript による結果が返されました。
誤動作の原因は map.resources を使っていたためで、 index というメソッドを post で呼び出すと、リソースの新規作成を行おうとしてしまいます。
当然作成すべきデータが何も渡されていないので、空のリソースができるか validation に引っかかるかした後、 index にリダイレクトされていたのでした。