在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 %>
当调用partial时,如何将locals传递给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
谢谢你的任何想法.
解决方法
>您需要确保控制器知道您按哪个列表的页面链接.我们通过将一个参数传递给will_paginate页面链接生成器来完成此操作.
>刷新任一列表的分页时,您需要确保js更新正确的html标记.我们通过将分页包装在依赖于情绪的:) div标签中来完成此操作.
>因为我们共享部分,我们需要确保在控制器中设置心情和正确的集合,并从索引视图(html和js)传递给局部部分.
>最后确保你重绘分页后你的ajax遥控器会被拿起(这是奖金)
>刷新任一列表的分页时,您需要确保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>
# index.js.erb $("#<%= @mood %>users").html(' <%= escape_javascript(render(partial: "users/user",locals: { users: @mood_users,mood: @mood })) %> ');
对于不显眼的ajax链接,你需要分页.
Ruby – Rails 3 – AJAXinate Paginate and sorting
# 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',:mood => 'happy',:happy_page => @happy_page,:sad_page => @sad_page } %> <%= render :partial => 'users/user',:mood => 'sad',:sad_page => @sad_page } %>
我们只需要在这里传递这个就不会得到部分未定义的方法.
# index.js.erb (fixed HTML Syntax) $("#<%= @mood %>users").html(' <%= escape_javascript(render(partial: "users/user",mood: @mood,:sad_page => @sad_page })) %> ');
# 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>