2013-06-22 122 views
8

我有一个用户的仪表板页面,其中左侧有一个工具栏,博客等链接的边栏。我希望能够点击链接,如“项目”链接和那么在主区域中,项目的视图会加载(视图将是项目的项目符号列表),而不必刷新页面。我试图让AJAX发生这种情况,但事情并不奏效。AJAX调用渲染Rails部分3

下面是我认为它应该工作的方式。其中/dash配置为路由到用户#侧边栏链接,用户点击show.html.erb

<%= link_to 'Projects', '/dash', remote: true %> 

显示在config/routes.rb文件是这样的:

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

,然后将show动作被称为users_controller.rb控制器:

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 %>"); 

这应该修改#ajax格在我的show.html.erb

<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上,所以//=jquery//=jquery_ujs下的app/assets/javascripts/application.js应该已经导入了必要的jQuery和AJAX功能。

回答

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