8

我有一个用户的仪表板页面,左侧有一个带有项目、博客等链接的侧边栏。我希望能够单击诸如“项目”链接之类的链接,然后在主区域中,项目视图将加载(视图将是项目的项目符号列表),而无需刷新页面。我正在尝试使用 AJAX 来实现这一点,但事情并没有奏效。

这就是我认为它应该如何工作的方式。用户点击侧边栏链接show.html.erb

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

where/dash配置为在config/routes.rb文件中路由到 users#show,如下所示:

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 div 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 和 AJAX 功能。//=jquery_ujsapp/assets/javascripts/application.js

4

1 回答 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.

于 2013-06-22T01:28:21.227 回答