mitsu1208g
@mitsu1208g (洋満 大石)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

いいね機能の非同期(js.erb部分テンプレート)が片方だけできません

解決したいこと

Rails初心者です;

いいね機能の非同期を実装しています。
create→非同期できない
delete→非同期できる

解決できる記述方法があれば教えてください。

環境

Ruby 2.6.5
Rails 6.0.0
jQuery 3.5.1

挙動

・Likeテーブルに保存、削除はできている
・daleteの時だけリンクボタンが非同期で’いいねを外す’→’いいね’に変わる
・createの時だとリンクボタンは’いいね’のままで、リロードすると'いいねを外す'に変わる

発生している問題・エラー

terminal.
ActionView::Template::Error (No route matches {:action=>"destroy", :controller=>"likes", :ids=>[44], :performance_id=>1}, missing required keys: [:id]):
    1:   <% if user_signed_in? %>
    2:     <% if current_user.likes.find_by(performance_id: @performance.id)  %>
    3:         <%=link_to 'いいねを外す' , performance_like_path(@performance.id, ids: @performance.likes.ids), method: :delete, remote: true %><%= @performance.likes.count %>
    4:       <% else %>
    5:        <%=link_to 'いいね', performance_likes_path(@performance.id), method: :post, remote: true %><%= @performance.likes.count %>
    6:       <% end %>
app/views/likes/_like.html.erb:3
app/views/likes/create.js.erb:3
Started GET "/performances/1" for ::1 at 2020-10-09 13:17:38 +0900
Processing by PerformancesController#show as HTML
  Parameters: {"id"=>"1"}

該当するソースコード

views/likes/_like.html.erb
  <% if user_signed_in? %>
    <% if current_user.likes.find_by(user_id: @performance.id)  %>
        <%=link_to 'いいねを外す' , performance_like_path(@performance.id), method: :delete, remote: true %><%= @performance.likes.count %>
      <% else %>
       <%=link_to 'いいね', performance_likes_path(@performance.id), method: :post, remote: true %><%= @performance.likes.count %>
      <% end %>
    <% else %>
      <p><span>お気に入り数→ </span><%= @performance.likes.count %></p>
   <% end %>
views/likes/create.js.erb(delete.js.erb)
$('.likes_buttons<%= @performance.id%>').html("<%= j(render partial: 'likes/like', locals: {performance: @performance, like: @like}) %>");
Likes_controller.
class LikesController < ApplicationController
    def create
      @like = Like.create(performance_id: params[:performance_id], user_id: current_user.id)
      @performance = Performance.find(params[:performance_id])
    end

    def destroy
      @like = Like.find_by(performance_id: params[:performance_id], user_id: current_user.id)
      @performance = Performance.find(params[:performance_id])
      @like.destroy
    end
end
views/perhormance/show.html.erb
  <div class="likes_buttons<%= @performance.id %>">
        <%= render partial: 'likes/like', locals: { performance: @performance, like: @like} %>
 </div>

自分で試したこと

①データ保存ができているということは、renderのpathがうまく渡っていないと怪しむ
→routeingは問題なし
②binding.pry
→idは渡っている(データベースに保存削除はできている)
③ターミナルのエラーで、create時に

terminal.
ActionView::Template::Error (No route matches {:action=>"destroy", :controller=>"likes", :ids=>[44], :performance_id=>1}, missing required keys: [:id]):

とでているので、

views/likes/_like.html.erb
2行目 <% if current_user.likes.find_by(user_id: @performance.id)  %>
↓
   <% if current_user.likes.find_by(id: @performance.id) %>

にしてみると、今度はcreateができたものの、deleteに遷移することなく永遠にcreateになってしまいました。
どうかよろしくお願いします。

参考にした記事

https://freecamp.life/rails-favorite-ajax/
https://qiita.com/max_3252/items/ca8f623563e26b6a8630
https://teratail.com/questions/266046

0

1Answer

こちら解決しました!
destroyアクションのpathに、like.idが指定されていないというエラーがlogででていて、渡してあげることで解決いたしました!

1Like

Your answer might help someone💌