前提
ここに質問の内容を詳しく書いてください。
(例)現在,Railsで転職用ポートフォリを作成中です。
現在、投稿機能、投稿に対するコメント機能、投稿に対するいいね機能などを実装しました。
投稿に対するいいね機能を非同期(Ajax)で実装しています。
いいねボタンを押した時にいいね解除ボタンを表示させるため、パーシャル(_like.html.haml)を作成しています。
いいねボタンを押したときにcreate.js.hamlにて、id: "post-#{post.id}-likes"のhtmlに_like.html.hamlをレンダリングする仕様です。
問題点
実際のいいね、いいね解除は問題なく動作するのですが、投稿一覧ページ(いいねボタンが大量に存在する) にて、
_like.html.haml が繰り返しによって各投稿ごとにrenderされてしまうため、ページ読み込みに時間がかかってしまいます。
※大まかな構造を説明するため、不要な部分を除いています。 **投稿一覧ページ** - @post.each do |post| = post.content %div{ id: "post-#{post.id}-likes" } = render 'like', post: post
**_like.html.haml** - if user_signed_in? - if post.already_liked?(current_user) = link_to post_like_path(post, post.likes), method: :delete, remote: true do %font .fas.fa-heart.likes-heart-already{ id: 'delete-like-link' } - else = link_to post_likes_path(post), method: :post, remote: true do %font .far.fa-heart.likes-heart-yet{ id: 'create-like-link' }
**create.js.haml** $("#post-#{@post.id}-likes").html("#{j(render('likes/like', post: @post))}");
**likes_controller.rb** class LikesController < ApplicationController before_action :authenticate_user! def create @post = Post.find(params[:post_id]) @like = current_user.likes.build(post_id: @post.id) @like.save respond_to do |format| format.js end end def destroy @post = Post.find(params[:post_id]) Like.find_by(post_id: @post.id, user_id: current_user.id).destroy respond_to do |format| format.js end end end
** posts_controller.rb ** #追加しました‼︎ 6/29 class PostsController < ApplicationController def index @posts = current_user.feed.eager_load(:user, :likes).page(params[:page]) #feedメソッドはUserモデルに定義 @post = Post.new @like = Like.new end end ** user.rb ** #追加しました‼︎ 6/29 class User < ApplicationRecord def feed following_ids = "SELECT following_id FROM relationships WHERE follower_id = :user_id" Post.where("posts.user_id IN (#{following_ids}) OR posts.user_id = :user_id", user_id: id) end end
考えている解決策
通常の投稿一覧ページへのアクセスではrenderを使用しない方法を考えているのですが、いいね機能の非同期処理を実装するにあたって_likeパーシャル作成は避けられないため、コードが重複してしまうので、悩んでいます。
初めての質問のため、説明不足、失礼な部分があるかもしれません。
何か良い方法がありましたらご教授お願いいたします。
補足情報(バージョンなど)
rails', '~> 5.2.1'
ruby '2.6.6'
docker環境
回答1件
あなたの回答
tips
プレビュー