web-dev-qa-db-ja.com

Rails3とjQueryでajaxを介して部分的にレンダリングするにはどうすればよいですか?

Rails 2:でこのようなsthを行うことができます

def show_rec_horses
  rec_horses = Horses.find(:all)
  page["allHorses"].replace_html :partial => "horses/recommended", :locals => 
 {:rec_horses => rec_horses}
end

Rails3でjQueryを使用してこれを行うにはどうすればよいですか。では、Rails3でdivのhtmlをajax call(link_to:remote => true)を介して部分的に置き換えるにはどうすればよいですか?.

私は(私のshow_rec_horses.js.erbで)次のようにsthを試しました:

$("#interactionContainer").update("<%= escape_javascript(render("horses/recommended"))%>");

そして、何も起こりません。他のバリエーションをいくつか試しましたが、うまくいきませんでした。何が悪いのですか?これは他の方法でアプローチする必要がありますか?どんな答えでも大歓迎です。

22
necker

さて、コントローラーから始めましょう。

def show_rec_horses
  @rec_horses = Horses.find(:all)

  respond_to do |format|
    format.html # show_rec_horses.html.erb
    format.js   # show_rec_horses.js.erb
  end
end

これにより、htmlリクエストまたはjavascriptリクエストのいずれかに対して正しいテンプレートがレンダリングされていることが確認されます。 javascriptリクエストに応答する必要があるだけの場合は、html部分を削除してください。

ここで、次の内容を含むページがあるとします。

<p><%= link_to 'Show Horses', show_rec_horses_path, remote: true %></p>

<div id="interactionContainer"></div>

リンクをクリックすると、コントローラーのshow_rec_horsesアクションが要求されます。このアクションにより、javascriptファイルがshow_rec_horses.js.erbになります。

このjavascriptファイルには、次のようなものが含まれている必要があります。

$('#interactionContainer').html('<%=j render partial: 'horses/reccommended', locals: { rec_horses: @rec_horses } %>')

これで、コンテナはhorses/_reccommended.html.erbのコンテンツで満たされます。これには、たとえば次のものが含まれます。

<% rec_horses.all.each do |rec_horse| %>
  <p><%= rec_horse.name %></p>
<% end %>
26
Arjan