8

在 Rails 3.2 索引视图中,我正在渲染两个部分。

<%= render :partial => 'users/user', :locals => {:users => @happy_users} %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users} %>

并且在部分

<% users.each do |user| %>
  Show some fields
<% end %>
<%= will_paginate users %>

分页不起作用。

如果我更改will_paginate为使用实例变量,则分页有效(但集合错误)

<%= will_paginate @users %>

调用部分时如何将本地人传递给 will_paginate?

(我意识到我还需要通过:param_name才能让这个与两个集合一起工作。现在我只是想让一个实例工作。)

部分通过 index.js.erb 呈现

$(".ajaxable-users").html('<%= escape_javascript(render("users/user")) %>');

控制器看起来像

def index
  @users = User.scoped.paginate(:page => params[:page], :per_page => 5)
  @happy_users = User.happy_scope.paginate(:page => params[:page], :per_page => 5)  
  @sad_users = User.happy_scope.paginate(:page => params[:page], :per_page => 5)  

  respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
      format.json { render :json => @users }
      format.js
  end
end

感谢您的任何想法。

4

3 回答 3

4
  1. 您需要确保控制器知道您按下哪个列表的哪个页面链接。我们通过将参数传递给 will_paginate 页面链接生成器来做到这一点。
  2. 在刷新任一列表的分页时,您需要确保您的 js 更新正确的 html 标记。我们通过将分页包装在一个与情绪相关的 :) div 标签中来做到这一点。
  3. 因为我们共享部分,所以我们需要确保在控制器中设置情绪和正确的集合,并从索引视图(html 和 js)作为本地传递给部分。
  4. 最后确保您的 ajax 遥控器在您重绘分页后拾起(这是一个奖励)

因此,根据请求情绪参数设置控制器实例变量

  • 请注意,此代码还为您节省了一些数据库调用,因为如果您只是对悲伤的用户进行分页,则不需要检索快乐的用户或全部)。
  • 为简单起见,我省略了@users,它从未使用过
  • 我怀疑悲伤用户的快乐范围只是一个错字

.

# controller
def index
  @mood = params[:mood]
  @mood_users = @happy_users = User.happy_scope.paginate(:page => params[:page], :per_page => 5) if @mood.blank? || @mood == 'happy'
  @mood_users = @sad_users = User.happy_scope.paginate(:page => params[:page], :per_page => 5) if @mood.blank? || @mood == 'sad'

  respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
      format.json { render :json => @users }
      format.js
  end
end

确保我们将正确的本地人分派给局部:

# index.html.erb
<%= render :partial => 'users/user', :locals => {:users => @happy_users, :mood => 'happy' } %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users, :mood => 'sad' } %>

使部分情绪敏感,允许不同的 div 标签 ID。还将心情放在请求网址中。

# users/user partial
<div id='<%= "#{mood || ''}users"%>'>
<% users.each do |user| %>
  Show some fields
<% end %>
<%= will_paginate users, :params => { :mood => mood } %>
</div>

此 js 允许根据按下的分页链接刷新不同 div 中的不同集合。

# index.js.erb
$("#<%= @mood %>users").html('
  <%= escape_javascript(render(partial: "users/user", locals: { users: @mood_users, mood: @mood })) %>
');

对于您需要的用于分页的不显眼的 ajax 链接。 Ruby - Rails 3 - AJAXinate 分页和排序

# in a generic js
$(document).ready(function () {
    $(".pagination").find("a").livequery(function () {
        $(this).attr("data-remote", true);
    });
});

请注意,即使未启用 javascript 并且我们使用 html,该解决方案也应该可以工作。在这种情况下,应该重新显示两个部分,以允许不同的页面。

修改代码以处理优雅的 JS 回退到 HTML

控制器

# controller
def index
  @mood = params[:mood]
  @happy_page = @mood == 'happy' ? params[:page] : params[:happy_page]
  @sad_page = @mood == 'sad' ? params[:page] : params[:sad_page]

  @mood_users = @happy_users = User.happy_scope.paginate(:page => @happy_page, :per_page => 5) if !request.xhr? || @mood == 'happy'
  @mood_users = @sad_users = User.happy_scope.paginate(:page => @sad_page, :per_page => 5) if !request.xhr? || @mood == 'sad'
  @mood_users = @users = User.scoped.paginate(:page => params[:page], :per_page => 5) if @mood.blank?

  respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
      format.json { render :json => @users }
      format.js
  end
end

将新视图变量转发到部分本地

# index.html.erb
<%= render :partial => 'users/user', :locals => {:users => @happy_users, :mood => 'happy', :happy_page => @happy_page, :sad_page => @sad_page } %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users, :mood => 'sad', :happy_page => @happy_page, :sad_page => @sad_page  } %>

我们只需要在此处传递它就不会部分获得未定义的方法。

# index.js.erb (fixed HTML syntax)
$("#<%= @mood %>users").html('
  <%= escape_javascript(render(partial: "users/user", locals: { users: @mood_users, mood: @mood, :happy_page => @happy_page, :sad_page => @sad_page })) %>
');

如果单击悲伤的页面链接,这将在 param 中保留快乐的页面,反之亦然。

# users/user partial
<div id='<%= "#{mood || ''}users"%>'>
<% users.each do |user| %>
  Show some fields
<% end %>
<%= will_paginate users, :params => { :mood => mood, :happy_page => happy_page, :sad_page => sad_page  %>
</div>
于 2012-05-30T12:52:52.060 回答
0

首先,在控制器中为每个列表创建两个不同的方法,例如 fill_list1 和 fill_list2 有独立的方法来创建主页例如索引

例如,每个列表方法都必须呈现没有布局的部分

render :partial=>'fill_list1', :layout => false

主页必须第一次调用局部视图。

当您单击分页控件时,您必须破解单击以调用 ajax 下一个分页项列表

$('list1 a').live('click', function(event){
  event.preventDefault();
  $.ajax(
    {url:URLFORCALLMETHODLIST,
     success: function(content) {
                DIVLOCATIONLIST.html(content);
              },
     async:false,
    });
});
于 2012-06-06T15:54:01.427 回答
-1

尝试在以下位置传递适当的本地人index.html.erb

$(".ajaxable-users").html('
  <%= escape_javascript(render("users/user", locals: { users: @users })) %>
');
于 2012-05-15T10:06:05.873 回答