如何在Rails3和jQuery中通过ajax呈现部分视图

22

我可以在Rails 2中像这样做:

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

如何在Rails3和jQuery中实现此功能。因此,我该如何通过ajax调用(link_to :remote => true)用partial替换我的div的html。

我尝试了类似以下的方法(在我的show_rec_horses.js.erb文件中):

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

什么也没有发生。我尝试了一些其他的变化,但都不起作用。我做错了什么?这个问题应该采用其他方法吗?非常感谢任何回答。

1个回答

26

好的,让我们从控制器开始。

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 %>

直到我刪除了 "respond_to do |format|" 區塊,它才對我起作用。 - Ash Blue
看起来它能按照我的需求工作,但在删除format.html之后,ajax请求失败并进入错误部分。实际上应该进入'show_rec_horses.js.erb'。可能是因为Rails 4的缘故,但对我来说不起作用。 - Abhishek
这对我很有帮助,但有一件事情让我困扰:我忘了需要为show_rec_horses创建一个路由。这部分对于大多数熟悉Rails的人来说可能很显然,但对于其他人来说包含这部分可能会有所帮助。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接