如何在同一视图中呈现两个分页和可共享的集合?

And*_*vey 8 ajax ruby-on-rails will-paginate

在Rails 3.2索引视图中,我呈现两个部分.

<%= render :partial => 'users/user', :locals => {:users => @happy_users} %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users} %>
Run Code Online (Sandbox Code Playgroud)

在部分

<% users.each do |user| %>
  Show some fields
<% end %>
<%= will_paginate users %>
Run Code Online (Sandbox Code Playgroud)

分页不起作用.

如果我改变will_paginate采取实例变量,分页工作(但错误的集合)

<%= will_paginate @users %>
Run Code Online (Sandbox Code Playgroud)

当调用partial时,如何将locals传递给will_paginate?

(我意识到我还需要传递:param_name以使用两个集合.现在我只是想让一个实例工作.)

部分通过index.js.erb呈现

$(".ajaxable-users").html('<%= escape_javascript(render("users/user")) %>');
Run Code Online (Sandbox Code Playgroud)

控制器看起来像

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
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何想法.

Vik*_*rón 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
Run Code Online (Sandbox Code Playgroud)

确保我们将正确的当地人分派给partials:

# index.html.erb
<%= render :partial => 'users/user', :locals => {:users => @happy_users, :mood => 'happy' } %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users, :mood => 'sad' } %>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

请注意,如果未启用 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
Run Code Online (Sandbox Code Playgroud)

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

# 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  } %>
Run Code Online (Sandbox Code Playgroud)

我们只需要在这里传递它,就不会在部分中获取未定义的方法。

# 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 })) %>
');
Run Code Online (Sandbox Code Playgroud)

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

# 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>
Run Code Online (Sandbox Code Playgroud)