2011年4月9日

link_to :remote=>trueには、Named Routeが必要?

Rails3でAJAXを使って、画面を動的に更新したいと思っていたのだが、どうもうまく行かなくてすごくはまってしまった。
どうやら、replace_htmlなどを動作させるには、Named Routeを指定する必要があるようだ。

jquery-railsをインストールした環境で、こんなコードは動く。
def show
@item = Item.find(params[:id])
respond_to do |format|
format.js do
render(:update) do |page|
page.replace_html 'Change', "Okay!"
end
end
end
end

しかし、これは動かない。
def showitem
@item = Item.find(params[:id])
respond_to do |format|
format.js do
render(:update) do |page|
page.replace_html 'Change', "Okay!"
end
end
end
end


いずれも、ページ中の
の中身を置き換えるだけのものだ。

show.html.erbで定義したリンクはこんな感じ。
showへのリンク: <%= link_to 'update', item_path(@mole), :remote => true %>
showitemへのリンク: <%= link_to 'update2', :action => 'showitem', :remote => true, :format => 'js' %>


showitemは、config/routes.rbでもこんな感じで定義
match 'items#showitem' => 'items#showitem'


こうすると、show.html.erbのソースは
update
update2

となる。
remote => trueが前者はちゃんとdata-remoteと認識されているのに対して、後者は、単なるパラメータになってしまっている。

後者は、リンクをクリックすると、javascriptが表示されるだけで、何も起こらない。

ここでずーっとはまったのだが、ふと、Named Routeを設定したらどうなるのか?と思い、やってみたら、うまく動いた。

route.rb
match 'items#showitem' => 'items#showitem', :as => 'showitem_item'

showitemへのリンク: <%= link_to 'update2', showitem_item_path, :remote => true %>

htmlのソース:update2


なにか間違えているからこうなるのかなあ。
Named Routeなしで同じことができるべきという気がするんだけど・・・

2 件のコメント:

straitwalk さんのコメント...

<%= link_to 'hoge', {:action => 'showitem'}, :remote => true %>
とかで、いけないでしょうか?

モール さんのコメント...

コメントありがとうございます。
{}で囲まなければならないんでしたか。

うーん、そうだったんですね。
また試してみます。