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 にリダイレクトされていたのでした。