在rails 3中使用ajax渲染部分时的空白页面

时间:2012-07-28 01:24:29

标签: ruby-on-rails ruby ruby-on-rails-3 jquery

我在show.html.erb文件中有一个包含2个标签/链接的导航菜单,在UsersController.rb中,我想使用ajax为标签呈现不同的部分。

show.html.erb我有一个名为profile-data的div,我想在其中显示内容。 所以我做了这样的事情:

链接结构:

<li><%= link_to "College friends", college_friends_path, :remote => true %></li>
<li><%= link_to "Highschool friends", highschool_friends_path, :remote => true %></li>

我定义路线:

match "college_friends" => "users#college_friends", :as => "college_friends"
match "highschool_friends" => "users#highschool_friends, :as => "highschool_friends"

我在UserController.rb中定义了必要的方法:

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def college_friends
    respond_to do |format|
      format.js
    end
  end

  def highschool_friends
    respond_to do |format|
      format.js
    end
  end
end

最后我们有JS文件:

* college_friends.js.erb *

$('#profile-data').html("<%= escape_javascript(render(:partial => 'college_friends')) %>");

* highschool_friends.js.erb *

$('#profile-data').html("<%= escape_javascript(render(:partial => 'highschool_friends')) %>");

部分代码:_college_friends.html.erb

<% groups = @user.friends.group_by(&:college_name) %>
<% sorted_groups = groups.sort_by{|key, values| values.count}.reverse %>
<% sorted_groups.each do |collegename, friends| %>
<% next if collegename.blank? %>
<div class="contentbox">
    <div class="box-header">
        <h3><%= collegename %></h3>
        <div class="meta-info">
            <p><i class="icon-map-marker"></i> Malmö</p>
            <p><i class="icon-user"></i><span class="count"> <%= friends.count %></span> vänner</p>
        </div>
    </div>
    <ul class="friends-list">
        <% friends.map do |friend| %>
        <li><%= image_tag(friend.image) %>
            <% end %> 
        </ul> 
    </div>
<% end %>

所以我解决了这个问题但是检查了来源和输出。我注意到js文件没有加载到应用程序中。

所以我改变了这个:

<%= javascript_include_tag :defaults %>

对此:

<%= javascript_include_tag "application" %>

并加载了所有必要的js文件。

但后来我收到了这个错误:

ActionView::Template::Error (undefined method `friends' for nil:NilClass):

2 个答案:

答案 0 :(得分:1)

根据上面的评论中的建议,您应该有两个名为_college_friends.html.erb_highschool_friends.html.erb的部分

这些将包含您的HTML,这是您希望通过$('#profile-data').html()

加载的内容

模板错误:

您未在@usercollege_friends中定义highschool_friends。因此,您的观点是请求@user来自该行动,而不是那里。

答案 1 :(得分:0)

你要

ActionView::Template::Error (undefined method `friends' for nil:NilClass):

由于

<% groups = @user.friends.group_by(&:college_name) %>

需要设置@user

布兰登建议,试试

def college_friends
  @user = User.find(params[:id])
  respond_to do |format|
    format.js
  end
end

<强> BUT

要实现此目的,您需要更改链接路由以包含用户ID,类似于此

match "college_friends/:id" => "users#college_friends", :as => "college_friends"

并在您的链接中

<li><%= link_to "College friends", college_friends_path(@user), :remote => true %></li>