gpt4 book ai didi

ruby-on-rails - 如何在同一个 View 中呈现两个分页和 ajaxable 集合?

转载 作者:行者123 更新时间:2023-12-04 08:45:36 25 4
gpt4 key购买 nike

在 Rails 3.2 索引 View 中,我正在渲染两个部分。

<%= 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 %>

调用部分时如何将本地人传递给 will_paginate?

(我意识到我还需要通过 :param_name 才能让这与两个集合一起工作。现在我只是想让一个实例工作。)

部分通过 index.js.erb 呈现
$(".ajaxable-users").html('<%= escape_javascript(render("users/user")) %>');

Controller 看起来像
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

感谢您的任何想法。

最佳答案

  • 您需要确保 Controller 知道 的哪个页面链接哪个列表 你按。我们通过将参数传递给 will_paginate 页面链接生成器来做到这一点。
  • 在刷新任一列表的分页时,您需要确保您的 js 更新正确的 html 标记。我们通过将分页包装在一个与情绪相关的 :) div 标签中来做到这一点。
  • 因为我们共享部分,所以我们需要确保在 Controller 中设置情绪和正确的集合,并从索引 View (html 和 js)作为本地传递给部分。
  • 最后确保您的 ajax Remote 在您重绘分页后能够启动(这是一个奖励)

  • 因此,根据请求情绪参数设置 Controller 实例变量
  • 请注意,此代码还为您节省了一些数据库调用,因为如果您只是对悲伤的用户进行分页,则不需要检索快乐的用户或全部)。
  • 为简单起见,我省略了@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

    确保我们将正确的本地人分派(dispatch)给局部:
    # 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 回退到 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

    将新 View 变量转发到部分本地
    # 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 })) %>
    ');

    如果单击悲伤的页面链接,这将在 param 中保留快乐的页面,反之亦然。
    # 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-on-rails - 如何在同一个 View 中呈现两个分页和 ajaxable 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597904/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com