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

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

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

在部分

  Show some fields   

分页不起作用。

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

  

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

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

部分通过index.js.erb呈现

 $(".ajaxable-users").html(''); 

控制器看起来像

 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 

谢谢你的任何想法。

  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。 也请求心情请求url。

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

这个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 Paginate和排序

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

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

修改后的代码也可以处理格式化的JS FALLBACK到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 })) %> '); 

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

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

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

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

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

主页面必须首次在视图中调用partials。

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

 $('list1 a').live('click', function(event){ event.preventDefault(); $.ajax( {url:URLFORCALLMETHODLIST, success: function(content) { DIVLOCATIONLIST.html(content); }, async:false, }); }); 

尝试在index.html.erb传递适当的locals:

 $(".ajaxable-users").html(' <%= escape_javascript(render("users/user", locals: { users: @users })) %> ');