86487


※[他質問サイト](https://teratail.com/questions/2qxw4a2ewuhk5b)でも同様の質問をしています。解決した場合はそちらも更新します。よろしくお願いします。

### 前提・実現したいこと

投稿された質問(post)に対して回答したコメント(comment)に非同期通信でいいね(good)を押す機能を実装したいです。

空のハートマークを押すと赤いハートに切り替わり、赤いハートを押すと空のハートマークに切り替わります。

DBは以下のように設計しています。  
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-02-18/825a1978-a1e5-412e-b7cd-769208dc5add.png)

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

いいねを押した後にリロードすると空のハートマークになってしまいます。  
そのまま赤いハートに残っていて欲しいです。

**①いいね（空のハート）を押す前**  
テーブルは空の状態です。  
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-02-18/94138b0c-19cf-465d-b891-cd96b1e88eb9.png)

**②いいねを押した後**  
テーブルに作成され、赤いハートに切り替わります。  
id:20, comment_id: 8, user_id: 1  
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-02-18/8a4d571a-d713-4713-ad21-fe4702178552.png)

**③リロードした後（問題がある点）**  
テーブルには作成されたままですが、空のハートになってしまいます。  
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-02-18/5e16fdc0-769c-404e-b14e-45553d488ebc.png)

**④もう一度いいねを押す**  
テーブルの中身は変わらず、赤いハートに切り替わります。  
id:20, comment_id: 8, user_id: 1  
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-02-18/5b055312-10b2-4aa9-be69-2a885fc78fcb.png)

**⑤赤いハートを押す**  
テーブルの中身は空になり、空のハートに切り替わります。  
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-02-18/38ba0425-2d97-4204-bd12-a19d6db42d48.png)

### 該当のソースコード

ビュー関連

[code]

    app/views/goods/_good.html.erb
    
    <% unless @comment.good_user(@current_user.id).blank? %>
      <%= link_to post_comment_good_path(post_id: @post.id, id: comment.goods[0].id), method: :delete, remote: true do %>
        <div class="vertical_good">
          <%= image_tag "icon_red_heart.png", size: '20x20' %>
        </div>
      <% end %>
    <% else %>
      <%= link_to post_comment_goods_path(@post, comment), method: :post, remote: true do %>
        <div class="vertical_good">
          <%= image_tag "icon_heart.png", size: '20x20' %>
        </div>
      <% end %>
    <% end %>
    
[/code]

[code]

    app/views/comments/_comment.html.erb
    
    <div class="p-comment__item">
      <p><%= simple_format(comment.comment) %></p>
      <div class="p-comment__bottomLine">
        <div id="goods_buttons<%= comment.id %>">
          <%= render partial: 'goods/good', locals: { post: @post, comment: comment } %>
        </div>
        <span><%= comment.created_at.to_s(:datetime_jp) %></span>
        <span><%= link_to '削除', post_comment_path(@post, comment), method: :delete, data: { confirm: '削除してよろしいですか？' } %></span>
      </div>
    </div>
    
[/code]

[code]

    app/views/posts/show.html.erb
    
    （省略）
    
    <div class="p-comment__list">
      <div class="p-comment_listTitle">コメント</div>
      <%= render @post.comments %>
    </div>
    
    <%= render partial: 'comments/form', locals: { comment: @comment } %>
    
[/code]

[code]

    app/views/goods/create.js.erb
    
    $('#goods_buttons<%= @comment.id %>').html("<%= j(render partial: 'goods/good', locals: {comment: @comment}) %>");
    
[/code]

[code]

    app/views/goods/destroy.js.erb
    
    $('#goods_buttons<%= @comment.id %>').html("<%= j(render partial: 'goods/good', locals: {comment: @comment}) %>");
    
[/code]

コントローラ

[code]

    goods_controller.rb
    
    class GoodsController < ApplicationController
      before_action :set_comment, only: %i[create destroy]
    
      def create
        @good = Good.create(user_id: current_user.id, comment_id: @comment.id)
      end
    
      def destroy
        good = Good.find_by(user_id: current_user.id, comment_id: @comment.id)
        good.destroy
      end
    
      private
    
      def set_comment
        @post = Post.find(params[:post_id])
        @comment = Comment.find(params[:comment_id])
      end
    end
    
[/code]

モデル関連

[code]

    comment.rb
    
    class Comment < ApplicationRecord
      belongs_to :post
      has_many :goods, dependent: :destroy
    
      validates :comment, presence: true, length: { maximum: 1000 }
    
      def good_user(user_id)
        goods.find_by(user_id: user_id)
      end
    end
    
[/code]

[code]

    good.rb
    
    class Good < ApplicationRecord
      belongs_to :comment
      belongs_to :user
    
      validates_uniqueness_of :comment_id, scope: :user_id
    end
    
[/code]

[code]

    user.rb
    
    class User < ApplicationRecord
    （省略）
      has_many :favorites
      has_many :goods
    
    （省略）
    end
    
[/code]

### 自分で調べたことや試したこと

テーブルには保存されているので、comment.rbのgood_user(user_id)メソッドがおかしいかと思いましたが、特に間違いは見つけられず  
そのメソッドを使用している_good.html.erbに問題があるのかと模索しましたが、わかりませんでした。

エラーメッセージが表示されているわけではないため原因の検討がつかず、知恵をお借りしたいです。

### 使っているツールのバージョンなど補足情報

ruby: 3.0.2  
rails: 6.0.4  
jquery-rails: 4.4.0


CC BY-SA 4.0
2022-02-18T10:05:05.290
86435
2022-03-09T02:31:31.207
2022-02-21T05:03:16.033
3060
51475
question
ruby-on-rails ruby ajax
テーブルに保存されているのに、リロードするとビューがリセットされる


`app/views/goods/_good.html.erb`にある`<% unless
@comment.good_user(@current_user.id).blank?
%>`ですが、`@comment`や`@current_user`の中身を確認したほうがよいでしょう。`@comment`のidが8で`@current_user.id`が1なら動作しているはずですので、どちらかが期待通りになっていない可能性があります。


CC BY-SA 4.0
2022-02-18T14:34:29.057
86440
2022-02-18T14:34:29.057
442
86435
answer


[他の質問サイト](https://teratail.com/questions/2qxw4a2ewuhk5b#reply-
ar3strfbg4weoz)にて解決しました。ご協力ありがとうございました。

＜追記＞  
`unless comment.good_user(@current_user.id).blank?`と`link_to
post_comment_good_path(post_id: @post.id, comment_id: comment.id, id:
@current_user), method: :delete, remote: true do`に修正したところ実装できました。  
条件分岐の読みにくさは別途修正します。


CC BY-SA 4.0
2022-02-21T02:37:03.190
86487
2022-03-09T02:31:31.207
2022-03-09T02:31:31.207
51475
51475
86435
answer