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