如何呈现在同一视图中的两个分页和ajaxable收藏?分页、视图、两个、收藏

2023-09-10 16:25:02 作者:、怨天尤人

在一个Rails 3.2索引视图我的渲染2的谐音。

 <%=渲染:部分=> 用户/用户,:当地人=> {:用户=> @happy_users}%GT;
<%=渲染:部分=> 用户/用户,:当地人=> {:用户=> @sad_users}%GT;
 

和在部分

 <%users.each做|用户| %>
  显示部分领域
<%结束%GT;
&其中;%= will_paginate用户%GT;
 
Word的哪种视图方式下,可以显示分页效果拜托了各位 谢谢

分页无法正常工作。

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

 <%= will_paginate @users%>
 

如何通过当地人will_paginate时,部分被称为?

(我知道我还需要通过:param_name 来得到这个工作有两个集合,现在我只是想获得一个实例的工作。 )

部分通过index.js.erb的渲染

  $(。ajaxable用户)HTML('<%= escape_javascript(渲染(用户/用户))%>');
 

和控制器看起来像

 高清指数
  @users = User.scoped.paginate(:页=> PARAMS [:页面]:per_page => 5)
  @happy_users = User.happy_scope.paginate(:页=> PARAMS [:页面]:per_page => 5)
  @sad_users = User.happy_scope.paginate(:页=> PARAMS [:页面]:per_page => 5)

  respond_to代码做|格式|
      的format.html#index.html.erb
      format.xml {渲染:XML => @users}
      format.json {渲染:JSON => @users}
      format.js
  结束
结束
 

感谢您的任何想法。

解决方案 您需要确保控制器知道哪些页面的其中列出您preSS链接。为此,我们传递一个参数来will_paginate页链接生成。 您需要确保您的js既清爽上市的分页时更新正确的HTML标签。我们这样做是通过包装分页的心情依赖:) div标签。 ,因为我们共同的部分,我们需要确保的心情,以及正确的集合设置在控制器,并传递到部分地方从索引视图(HTML和JS)。 最后确保你的AJAX远程拿起你重绘分页(这是一个奖金)在

所以,增值分销商根据要求的心情参数来设置控制器实例

注意,这code也免去你一些数据库的调用,因为如果你只是pagintae伤心用户不需要检索快乐的人或全部)。 在我ommit @users为简单起见,它从来没有使用过 我怀疑开心范围悲伤用户只是一个错字

 #控制器
高清指数
  @mood = PARAMS [:心情]
  @mood_users = @happy_users = User.happy_scope.paginate(:页=> PARAMS [:页面]:per_page => 5)如果@ mood.blank? || @mood =='快乐'
  @mood_users = @sad_users = User.happy_scope.paginate(:页=> PARAMS [:页面]:per_page => 5)如果@ mood.blank? || @mood =='伤心'

  respond_to代码做|格式|
      的format.html#index.html.erb
      format.xml {渲染:XML => @users}
      format.json {渲染:JSON => @users}
      format.js
  结束
结束
 

确认我们派遣合适的当地人谐音:

 #index.html.erb
<%=渲染:部分=> 用户/用户,:当地人=> {:用户=> @happy_users,:情绪=> 快乐的}%GT;
<%=渲染:部分=> 用户/用户,:当地人=> {:用户=> @sad_users,:情绪=> 可悲的'}%GT;
 

进行部分情绪敏感,允许不同的div标签ID。也把心情请求URL。

 #用户/用户部分
< D​​IV ID ='<%=#{情绪||''}网友%>'>
<%users.each做|用户| %>
  显示部分领域
<%结束%GT;
&其中;%= will_paginate用户:PARAMS => {:情绪=>心情}%GT;
< / DIV>
 

这个js使得这取决于分页链接被pressed在不同的div清凉不同的集合。

 #index.js.erb的
$(#<%= @mood%>用户)。HTML('
  <%= escape_javascript(渲染(部分:用户/用户,当地人:{用户:@mood_users,情绪:@mood}))%>
');
 

有关不显眼的AJAX链接分页需要。 Ruby - Rails的3 - AJAXinate分页和排序

 #在通用的js
$(文件)。就绪(函数(){
    $(分页)。找到(A)。的liveQuery(函数(){
        $(本).attr(数据的远程,真正的);
    });
});
 

请注意,如果未启用JavaScript,我们依傍HTML的解决方案应该甚至工作。在这种情况下,两部分,应重新显示允许不同的页面。

修饰code同时还处理GRACEFUL JS后备HTML

控制器

 #控制器
高清指数
  @mood = PARAMS [:心情]
  @happy_page = @mood =='幸福'? PARAMS [:页面]:PARAMS [:happy_page]
  @sad_page = @mood =='难过'? PARAMS [:页面]:PARAMS [:sad_page]

  @mood_users = @happy_users = User.happy_scope.paginate(:页=> @happy_page,:per_page =→5)如果request.xhr!? || @mood =='快乐'
  @mood_users = @sad_users = User.happy_scope.paginate(:页=> @sad_page,:per_page =→5)如果request.xhr!? || @mood =='伤心'
  @mood_users = @users = User.scoped.paginate(:页=> PARAMS [:页面]:per_page => 5)如果@ mood.blank?

  respond_to代码做|格式|
      的format.html#index.html.erb
      format.xml {渲染:XML => @users}
      format.json {渲染:JSON => @users}
      format.js
  结束
结束
 

提出了新的观点瓦尔局部地方

 #index.html.erb
<%=渲染:部分=> 用户/用户,:当地人=> {:用户=> @happy_users,:情绪=> 快乐的,:happy_page => @happy_page,:sad_page => @sad_page}%GT;
<%=渲染:部分=> 用户/用户,:当地人=> {:用户=> @sad_users,:情绪=> 伤心,:happy_page => @happy_page,:sad_page => @sad_page}%GT;
 

我们只需要在这里通过这没有得到未定义的方法在部分。

 #index.js.erb的(固定的HTML语法)
$(#<%= @mood%>用户)。HTML('
  <%= escape_javascript(渲染(部分:用户/用户,当地人:{用户:@mood_users,情绪:@mood,:happy_page => @happy_page,:sad_page => @sad_page}))%>
');
 

这会再坚持开心页参数,如果悲伤的网页链接被点击,而正相反。

 #用户/用户部分
< D​​IV ID ='<%=#{情绪||''}网友%>'>
<%users.each做|用户| %>
  显示部分领域
<%结束%GT;
&其中;%= will_paginate用户:PARAMS => {:情绪=>心情:happy_page => happy_page,:sad_page => sad_page%>
< / DIV>
 

In a Rails 3.2 index view I am rendering two partials.

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

and in the partial

<% users.each do |user| %>
  Show some fields
<% end %>
<%= will_paginate users %>

The pagination is not working.

If I alter will_paginate to take an instance variable, pagination works (but the wrong collection)

<%= will_paginate @users %>

How can I pass locals to will_paginate when the partial is called?

(I realize that I'll also need to pass :param_name to get this working with two collections. For now I'm just trying to get one instance working.)

The partial is rendered via index.js.erb

$(".ajaxable-users").html('<%= escape_javascript(render("users/user")) %>');

And the controller looks like

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

Thanks for any ideas.

解决方案

you need to make sure the controller knows which page link of which listing you press. we do this by passing a param to will_paginate page link generator. you need to make sure your js updates the correct html tag when refreshing the pagination of either listing. we do this by wrapping the pagination in a mood-dependent :) div tag. since we share the partial we need to make sure mood as well as correct collection is set in controller and passed to partial as local from index views (both html and js). finally make sure your ajax remote picks up after you redraw pagination (this is a bonus)

so, to set controller instance vars depending on request mood parameter

note that this code also spares you some db calls, since if you just pagintae sad users you do not need to retrieve happy ones or all). I ommit @users for simplicity, its never used I suspect happy scope for sad users is only a typo

.

# 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

make sure we dispatch the right locals to partials:

# index.html.erb
<%= render :partial => 'users/user', :locals => {:users => @happy_users, :mood => 'happy' } %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users, :mood => 'sad' } %>

make partial mood sensitive allowing for distinct div tag id. also put mood in request url.

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

this js allows for refreshing different collections in different divs depending on which pagination link was pressed.

# index.js.erb
$("#<%= @mood %>users").html('
  <%= escape_javascript(render(partial: "users/user", locals: { users: @mood_users, mood: @mood })) %>
');

For unobtrusive ajax links for pagination you need. Ruby - Rails 3 - AJAXinate Paginate and sorting

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

Note that the solution should even work if javascript is not enabled and we fall back on html. In this case both sections should be redisplayed allowing for different pages.

MODIFIED CODE TO ALSO HANDLE GRACEFUL JS FALLBACK TO HTML

controller

# 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

forward new view vars to partial local

# 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  } %>

we only need to pass this here to not get undefined method in partial.

# 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 })) %>
');

this will then persist happy pages in param if sad page link is clicked, and vica versa.

# 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>

 
精彩推荐
图片推荐