如何在同一视图中呈现两个分页和可共享的集合?
在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
谢谢你的任何想法。
- 您需要确保控制器知道您按哪个列表的页面链接。 我们通过将一个参数传递给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。 也请求心情请求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 })) %> ');