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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何在同一视图中呈现两个分页和可共享的集合?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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遥控器会被拿起(这是奖金)

所以,根据请求情绪参数设置控制器实例变量

>请注意,此代码还会为您节省一些数据库调用,因为如果您只是对悲伤用户进行了分析,则无需检索快乐用户或所有用户.
>为了简单起见,我省略了@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 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>

猜你在找的Ruby相关文章