いいねクリック後にいいね数をブラウザ上に表示させたい
現在Rails
とReact
を用いていいね機能の実装はできましたが、いいねクリック後に投稿されたものにいいね数を表示させたいのですが実装方法がわからず、皆様のアドバイスを頂きたくご相談させて頂きました。
現在の実装ですと初期値を0と設定しておりますが、いいねをすると0と表示され、削除をすると-1と表示されてしまうので、この部分を解決したいです。
イメージとしては、Twitterのいいね機能になります。
###実装の仕様は下記の通りです
・投稿に対してログインユーザーがいいねできる
・Reactの非同期処理で、クリック時に色が変わりfavoriteテーブルにidが保存される
・クリックされる度に、いいね数が変化する
・初期値は0と設定されており、削除したとしても-1表示にならない実装(現在の実装ですと、初期値0に対して数字が変化してしまうため、クリックすると0となり、削除すると-1と表示されてしまう。)
該当のソースコード
app/javascript/bundles/Favorite.jsx
jsx
1import PropTypes from 'prop-types'; 2import React, { useState } from 'react'; 3import { HeartFill } from 'react-bootstrap-icons'; 4import axios from 'axios' 5 6axios.defaults.headers['X-CSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); 7 8const Favorite = (props) => { 9 const { uploadId, favoriteId } = props; 10 const [id, setId] = useState(favoriteId); 11 const [count, setCount] = useState( 0) 12 13 const clicked = async () => { 14 if (id == null) { 15 const { data: { id = null } } = await axios.post('/favorites', { upload_id: uploadId }) 16 id && setId(id); 17 } else { 18 await axios.delete(`/favorites/${id}`) 19 setId(null); 20 } 21 22 if (id == null) { 23 setCount(count + 1) 24 } else { 25 setCount(count - 1) 26 } 27 } 28 29 return ( 30 <> 31 <HeartFill 32 color={id ? 'red' : '#616161'} 33 size={25} 34 onClick={clicked} 35 /> 36 <p>{count}</p> 37 </> 38 ); 39}; 40 41Favorite.propTypes = {}; 42 43export default props => <Favorite {...props} />;
app/views/upload/index.html.erb
erb
1<div class="favorite"> 2 <% if user_signed_in? %> 3 <p><%= react_component("Favorite", props: { uploadId: upload.id, favoriteId: upload.favorite_by(current_user)&.id }, prerender: false) %></p> 4 <% else %> 5この部分にログインしていないユーザーに、いいねボタンといいね数を表示させる実装をする 6 <% end %> 7 </div>
試したこと
・条件分岐でcount === 0
を設定してみたが、いいね数が表示されなくなってしまった。
・index.html.erbに<%= upload.favorite.count%>
と記述して挙動を確認してみたが、リロードしない限りいいね数が変化しなかった。
補足情報(FW/ツールのバージョンなど)
開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)