【问题标题】:Rails Ajax pagination/infinite scroll - keeping it fast and efficient?Rails Ajax 分页/无限滚动 - 保持快速高效?
【发布时间】:2020-09-17 06:39:40
【问题描述】:

我有一个非常经典的 ajax 分页案例,我对记录进行分页(使用 Kaminari),当用户点击“加载更多”按钮时,应该通过 ajax 加载和插入下一页/记录集。

问题是我看到的大多数示例都非常简单,索引操作看起来像这样:

def index
  users = User.page(params[:page]).per(10)
end

分页(或加载更多)按钮只是不断调用该索引操作,下一个page 参数。

问题是,我的索引操作比这LOT更多,当我想要的只是下一页用户记录时,我不想运行所有代码 - 它是缓慢而不必要。

就惯例而言,最干净的处理方式是什么?我的想法是在index 之外还有另一种方法,如下所示:

def load_more_users
  users = User.page(params[:page]).per(10)
end

分页调用那个而不是索引。但是,是否有一种简洁的方法可以在索引操作中执行条件,例如检查 params[:page]if request.xhr? 是否存在?

最好的方法是什么?

【问题讨论】:

    标签: ruby-on-rails ajax pagination infinite-scroll kaminari


    【解决方案1】:

    您也许可以为此使用respond_to

    respond_to do |format|
      format.html {
         # Existing index controller code
         # Will render the existing template
      }
      format.js {
         users = User.page(params[:page]).per(10)
         render json: users # Or render a partial
      }
    end
    

    Ajax 将命中format.js 块,初始页面加载将命中format.html 块。

    【讨论】:

    • 这很有趣,谢谢。我认为这会奏效,但按照惯例,我还没有看到它像那样使用过。我总是在处理路由和重定向逻辑的方法末尾看到 respond_to 块。
    • 按照惯例,所有这些都是在给定特定请求格式的情况下执行一段代码。正如你所说,你可以用 if else 语句完成同样的事情,我认为这更清楚。我们倾向于在我们的一个应用程序中使用这种格式,所以如果它是“错误的”,我希望我的老板能向我指出这一点。 :)
    • @scilence 我同意这是要走的路,但是我会使用format.json,因为这会呈现 JSON。 js 通常用于“js.erb”视图中的 Javascript 代码,以便在客户端执行。 Rails Example
    • @engineersmnky 你说得对。例如,我假设 OP 正在向与 html 相同的端点发出普通的 ajax 请求。如果 ajax 请求未命中 /path.json,而是对 /path 的 xhr 请求,它将命中 format.js 而不是 format.json。我们在格式块中呈现的内容并不重要,重要的是我们如何请求它。
    • 我完全理解我们在渲染什么并不重要我只是觉得format.js 的双重使用(顺便说一句非常普遍)是一种混蛋。我最喜欢 ruby​​ 的一个方面是它的确定性,json 显然更符合预期
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2017-12-10
    相关资源
    最近更新 更多