惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Jina AI
Jina AI
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
博客园 - 司徒正美
罗磊的独立博客
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Vercel News
Vercel News
A
About on SuperTechFans
I
InfoQ
D
DataBreaches.Net
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) 如何提升你的程式可讀性之實務技巧(一) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 如何在區域網路用 Docker 架設有 SSL 的 Gitlab 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能
讓分頁用無限捲軸載入
Nic Lin · 2017-08-23 · via Nic Lin's Blog

讓分頁用無限捲軸載入

Infinite Scrolling to load more records from database using Ruby on Rails

Gems installed

gem 'will_paginate', '~> 3.1'

gem 'bootstrap-sass', '~> 3.3', '>= 3.3.6'

gem 'bootstrap-will_paginate', '~> 0.0.10'

Gem removed

gem 'turbolinks'

建立 Post Controller

運用場景:

Post#index 的 view ,可以無限下拉來達到 Load more

controller 要能 respond JS

class PostsController < ApplicationController
  def index
    @posts = Post.paginate(page: params[:page],
                           per_page: 5).order('created_at DESC')

    respond_to do |format|
      format.html
      format.js
    end
  end
end
$( document ).ready(function() {

  //infinite scrolling
  if ($('.loading-next-page').size() > 0) {
    $(window).on('scroll', function() {
      more_posts_url = $('.loading-next-page').attr('href');
      if (more_posts_url && ($(window).scrollTop() > $(document).height() - $(window).height() - 60)) {
        $('.loading-next-page').replaceWith('<p class="loading-next-page">Load more...</p>');
        $.getScript(more_posts_url);
      }
    });
  };
});

先做一個 Ajax helper

  def render_ajax_next_page_link(posts)
    link_to("next page", posts_path(page: posts.next_page), remote: true, class: 'btn btn-primary loading-next-page hidden' )
  end

class 裡面的 hidden 可加可不加,不加的話在 Load more 會有一瞬間跑出來這個按鈕就是了

<div id="listing-infinite-scrolling">
    <%= render @posts %>
</div>

<div>
    <%= render_ajax_next_page_link(@posts) %>
</div>

記得把 partial 補上

<h2><% post.title %></h2>
<p><% post.description %></p>

這邊 tag 跟樣式可以自訂,本文章不多贅述

寫 js.erb

$('#listing-infinite-scrolling').append('<%= j render @posts %>');

<% if @posts.next_page %>
  $('.loading-next-page').replaceWith('<%= j render_ajax_next_page_link(@posts) %>');
<% else %>
  $(window).off('scroll');
  $('.loading-next-page').remove();
<% end %>

接下來應該可以在 post#index 頁面,做到無限捲軸下拉載入了

如果要做成用按鈕載入新的樣式,只要把 JS 行為拔掉,改用 render_ajax_next_page_link 這個 helper 出來的 button 就可以了(記得把 class 裡面的 hidden 移除掉,否則你會看不到這個按鈕)

Done.

參考來源

3 ways to load more records from database using Ruby on Rails