いいね機能の非同期(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