質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

1528閲覧

ReactとRailsでいいね数を表示したい

yuu0000

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/06/08 14:46

いいねクリック後にいいね数をブラウザ上に表示させたい

現在RailsReactを用いていいね機能の実装はできましたが、いいねクリック後に投稿されたものにいいね数を表示させたいのですが実装方法がわからず、皆様のアドバイスを頂きたくご相談させて頂きました。

現在の実装ですと初期値を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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2021/06/09 02:21

count === 0 じゃなくて count > -1 にしないと、0にしか反応しないのでは?
yuu0000

2021/06/09 06:34

ご連絡頂きありがとうございます! 下記のように修正してみましたが誤りがありますでしょうか、、 if (id == null) { setCount(count + 1) } else { setCount(count > - 1) }
FKM

2021/06/09 06:43

setCountは同期をとるためのメソッドなので、そんな使い方してはだめです。
yuu0000

2021/06/09 06:51

使用方法にあやまりがあるんですね、、
guest

回答1

0

JSXテンプレートに以下のように記述してもだめでしょうか?

js

1 return ( 2 <> 3 <HeartFill 4 color={id ? 'red' : '#616161'} 5 size={25} 6 onClick={clicked} 7 /> 8 <p>{count > -1 && count}</p> 9 </> 10 ); 11

投稿2021/06/09 06:56

編集2021/06/09 06:57
FKM

総合スコア3644

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu0000

2021/06/09 07:26

ありがとうございます。 記載して頂いた記述に修正してみたところ、いいねされてもカウントが変化しない挙動になりました。 const [count, setCount] = useState( 0)で定義した、setCountが未定義のために変化していないと考えました。 const clicked = async () => { if (id == null) { const { data: { id = null } } = await axios.post('/favorites', { upload_id: uploadId }) id && setId(id); } else { await axios.delete(`/favorites/${id}`) setId(null); } } 上記のクリック時の処理の中で、setCountの処理を記述する必要があると思いますが、条件分岐でクリック時にidがnullの場合にカウントを変化させる記述とも考えております。
FKM

2021/06/09 07:34

clickedメソッドの最後にsetCount(count)としないとcountの値の同期がとれませんよ。そこはReactのuseStateフックの分割代入部分なので。 自分は何箇所も同じフックを置くのはよくないとアドバイスを送ったつもりでした(最後だけで十分です)
yuu0000

2021/06/09 07:42

定義しないと処理されないですよね、、 const clicked = async () => { の配下にsetCount(count)を記述することですね
yuu0000

2021/06/09 09:12

下記のように修正してみたことろ、いいねをクリックした場合でもカウント数に変化が見られない状態になりました。 const clicked = async () => { if (id == null) { const { data: { id = null } } = await axios.post('/favorites', { upload_id: uploadId }) id && setId(id); } else { await axios.delete(`/favorites/${id}`) setId(null); } setCount(count > -1 && count) } return ( <> <HeartFill color={id ? 'red' : '#616161'} size={25} onClick={clicked} /> <p>{count}</p> </> );
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問