もふもふ技術部

IT技術系mofmofメディア

【Rails7】JS不要!Hotwireで無限スクロールを実装する

Hotwireを使ってみる第三弾です!
今回はJSを使わずに、Hotwireで無限スクロールを実装してみます。

下準備

1. Gemをインストールする
gem "kaminari"
2. モデルを作る
$ rails g model post

20240813000000_posts.rb

class CreatePosts < ActiveRecord::Migration[7.1]
  def change
    create_table :posts do |t|
      t.string :name
      t.timestamps
    end
  end
end

実装する

1. ルーティングを設定する

config/routes.rb

resources :posts, only: [:index]
2. コントローラーの実装

app/controllers/posts_controller.rb

class PostsController < ApplicationController
  def index
    posts = Post.all
    if params[:page].present?
      @posts = posts.page(params[:page]).per(5)
      render turbo_stream: turbo_stream.replace("posts", partial: "posts")
    else
      @posts = posts.page(1).per(5)
      render :index
    end
  end
end
3. viewsの実装

app/views/posts/index.html.erb

<%= render 'posts' %>

app/views/posts/_posts.html.erb

<% @posts.each do |post| %>
  <div><%= post.name %></div>
<% end %>
<% if @posts.next_page %>
  <%= turbo_frame_tag "posts", loading: :lazy, src: posts_path(page: @posts.next_page) %>
<% end %>

終わり

これで実装完了です!!
loading: :lazy で遅延読み込みをすることにより、無限スクロールを実現しています。
JSを使わずに無限スクロールが実装できるなんて、数年前の自分が知ったらビックリして腰が抜けると思います。
意外と簡単に使えたので、他の機能でも応用できそうですね!