ベストアンサー機能を実装したい

実現したいこと

  • 掲示板サイトにおいて、回答の中からベストアンサーを選べるようにしたい。
  • ベストアンサーに選ばれた回答を投稿した人にポイントが付与されるようにしたい。

前提

現在rubyで掲示板を作っています。フレームワークはsinatraです。
掲示板の機能の中で、質問に対するいくつかの回答のうち、1つだけ質問投稿者がベストアンサーを選ぶことができるようにしたいです。さらに、ベストアンサーに選ばれた回答を投稿した人にはポイントが付与されるようにしたいです。
データベースのテーブル構造は、

  • 質問を格納するpostテーブル
  • 回答が格納されるcommentテーブル
  • ユーザー情報が格納されるuserテーブル

の3つです。
userテーブルとcommentテーブルは、commentテーブルのuser_idカラムとuserテーブルのidカラムで接続されています。
commentテーブルはbestanswerカラムを保持しており、これはboolean型なのでbestansweに選ばれれば、trueになるという形です。
userテーブル内にpointカラムがあり、ここが各ユーザーが獲得したポイントを格納するカラム。
個々のポイントがベストアンサーに選ばれると増えていく仕組みです。

発生している問題・エラーメッセージ

現在エラーメッセージはなく、以下のコードにおいて実行したところ、bestanswerカラムは正しくtrue falseが切り替えられる。
一方でユーザーポイントに変動はなし。

該当のソースコード

html

1/*@contents1には特定の質問に対する回答が格納されている。*/ 2<% @contents1.each do |content1| %> 3 <div class="card">4 <h3 class="body"><%= content1.body %></h3>5 6 <form class="bestanswer" action="/bestanswer/<%= content1.id %>" method="post">7 <input type="hidden" name="user_id" value="<%= content1.user_id %>">8 <input type="hidden" name="question_id" value="<%= content1.question_id %>">9 <input type="submit" value="BestAnswer">10 </form> 11 12 //ここでbestanswerのtrue/flase状況、取得したいユーザー情報を表示。問題なく表示できている 13 <p><%= content1.bestanswer %></p>14 <p><%= content1.user_id %></p>15 <p><%= content1.user.point %></p>16 17 </div>18<% end %>

ruby

1post '/bestanswer/:id' do2 content1 = Comment.find(params[:id])3 content1.bestanswer = !content1.bestanswer 4 content1.save 5 6 7 user = User.find(params[:user_id])8 if content1.update(bestanswer: true)9 user.update(point: user.point + 1)10 link = "/#{params[:question_id]}"11 redirect link 12 else13 "error making best answer"14 end 15end

試したこと

コンソールでエラーログの有無の確認→なし
エラーメッセージなし。
以下の仮説に基づき、いくつか検証を行った
①user_idが正しく引っ張れていないため、どのユーザーにポイントを付与するのかが分かっていない
→<p><%= content1.user_id %></p>で確認したところuser_idはしっかりとれている。
②テーブル同士の接続がうまくいっていない
→その場合、user_idからuserのpointカラムを参照できないはず
→しっかりポイント参照できた。= テーブル同士の接続はうまくいっていると考えられる。
③ajaxリクエストが正しく送れていない
→ネットワークタブの確認、しっかりレスポンスあった

コメントを投稿

0 コメント