在Rails 3中进行AJAX调用以呈现部分内容

8
我有一个用户仪表板页面,左侧有类似于“项目”、“博客”等链接的侧边栏。我想要能够点击“项目”链接,然后在主区域中加载项目视图(视图将是项目的项目列表),而无需刷新页面。我正在尝试使用AJAX实现这一点,但事情并没有按计划进行。
以下是我认为它应该如何工作的方式。用户在show.html.erb中点击侧边栏链接。
<%= link_to 'Projects', '/dash', remote: true %>

其中/dashconfig/routes.rb文件中被配置为路由到users#show,如下所示:

match '/dash' => 'users#show'

然后,在users_controller.rb控制器中调用了show动作:

def show
    @user = User.find(params[:id])
    @projects = @user.projects

    respond_to do |format|
      format.html # renders show.html.erb
      format.js   # renders show.js.erb
    end
end

show.js.erb文件在哪里执行。我的show.js.erb文件只有一行代码:

$('#ajax').html("<%= escape_javascript(render(:partial => 'projects/index')).html_safe %>");

这应该修改我在show.html.erb中的#ajax div:

<div id="ajax">
  <%= render :template => 'projects/index' %>
</div>

app/views/projects/index.html.rb会接收@projects并呈现一个列表,类似这样:

<% @projects.each do |project| %>
  <p><%= project.name %></p>
<% end %>

显然,我的做法是错误的,因为这不起作用。我做错了什么?是否有其他需要更改的代码?我使用的是Rails 3.2.13,所以在app/assets/javascripts/application.js下的//=jquery//=jquery_ujs应该已经导入了必要的jQuery和AJAX功能。
1个回答

11
问题在于您的show.js.erb文件中,您试图呈现一个局部视图,但是您传递的文件不是局部视图。局部视图的文件名以下划线_开头。
为了避免重复代码,这里是我会做的事情:
# app/views/projects/show.js.erb
$('#ajax').html("<%= escape_javascript(render :partial => 'index', :locals => { :projects => @projects } ) %>");

# app/views/projects/index.html.erb
<%= render :partial => 'index', :locals => { :projects => @projects } %>

# app/views/projects/**_**index.html.erb
# Include here the code that you previously had in index.html.erb
# Don't forget to change @projects to projects
<% projects.each do |project| %>
  <p><%= project.name %></p>
<% end %>

此外,在您的路由中不应使用match,因为您几乎永远不需要让您的路由同时可通过GET和POST方法访问。因此,请尝试使用get代替match


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