I have set all codes in controllers, routes and views in my rails app that need to make like/dislike by user for reviews. It is working clearly. issue is refreshing the page. Then I asked on forums and checked threads in here then made something. Now "like and dislike" is working but like/dislike count is not getting till i reload the page.
My codes are:
likes_controller.rb :
# app/controllers/likes_controller.rb
# app/controllers/likes_controller.rb
class LikesController < ApplicationController
before_action :authenticate_user!
def create
@like = current_user.likes.new(like_params)
@like.save
@likeable = @like.likeable
respond_to do |format|
format.turbo_stream
format.html { redirect_to request.referrer || root_path }
end
end
def destroy
@like = current_user.likes.find(params[:id])
@likeable = @like.likeable
@like.destroy
respond_to do |format|
format.turbo_stream
format.html { redirect_to request.referrer || root_path }
end
end
def dislike
@like = current_user.likes.find(params[:like_id])
if @like.liked?
@like.update_attribute(:liked, false)
else
@like.update_attribute(:liked, true)
end
@likeable = @like.likeable
respond_to do |format|
format.turbo_stream
format.html { redirect_to request.referrer || root_path }
end
end
private
def like_params
params.require(:like).permit(:likeable_id, :likeable_type, :liked)
end
end
rendered partial in _review.html.erb. :
<div class="flex text-sm py-2">
<%= turbo_stream_from dom_id(review) %>
<%= render partial: "likes/like_button", locals: { likeable: review } %>
</div>
_like_button.html.erb is:
<%= turbo_frame_tag dom_id(likeable, :like_button) do %>
<%= turbo_stream_from dom_id(likeable) %>
<% like = current_user.likes.find_by(likeable: likeable) if current_user.present? %>
<% if like.nil? %>
<span class="inline-block">
<%= link_to likes_path(like: { likeable_id: likeable.id, likeable_type: likeable.class.name, liked: true }), method: :post, class: "dislike-button inline", remote: true do %>
<button type="button"><i class="fa fa-thumbs-up"></i> (<%= likeable.likes.where(liked: true).count %>)</button>
<% end %>
</span>
<span class="inline-block">
<%= link_to likes_path(like: { likeable_id: likeable.id, likeable_type: likeable.class.name, liked: false }), method: :post, class: "dislike-button inline", remote: true do %>
<button type="button"><i class="fa fa-thumbs-down"></i> (<%= likeable.likes.where(liked: false).count %>)</button>
<% end %>
</span>
<% else %>
<span class="inline-block">
<%= link_to like_dislike_path(like, like: { likeable_id: likeable.id, likeable_type: likeable.class.name, liked: false }), method: :put, class: "dislike-button inline", remote: true do %>
<button type="button"><i class="fa fa-thumbs-up"></i> (<%= likeable.likes.where(liked: true).count %>)</button>
<% end %>
</span>
<span class="inline-block">
<%= link_to like_dislike_path(like, like: { likeable_id: likeable.id, likeable_type: likeable.class.name, liked: false }), method: :put, class: "like-button inline", remote: true do %>
<button type="button"><i class="fa fa-thumbs-down"></i> (<%= likeable.likes.where(liked: false).count %>)</button>
<% end %>
</span>
<% end %>
<% end %>
my routes.rb. :
resources :reviews do
resources :reports, module: :reviews
resources :likes, only: [:create, :destroy], module: :reviews, shallow: true
end
create.turbo_stream.erb
<turbo-stream action="replace" target="<%= dom_id(@likeable, :like_button) %>">
<%= render partial: "like_button", locals: { likeable: @likeable } %>
</turbo-stream>
also dislike.turbo.erb:
<turbo-stream action="replace" target="<%= dom_id(@likeable, :like_button) %>">
<%= render partial: "like_button", locals: { likeable: @likeable } %>
</turbo-stream>
and issue on server(turbo errors) is:
worker | 2023-03-22T17:41:13.173Z pid=42022 tid=165q class=Turbo::Streams::ActionBroadcastJob jid=64272ba7d3a0971c4b1a2906 ERROR: Error performing Turbo::Streams::ActionBroadcastJob (Job ID: b4206b03-d55e-47b8-b972-e1b93efd4ebe) from Sidekiq(default) in 19.7ms: ActionView::MissingTemplate (Missing partial likes/_like with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}.
worker |
like and dislike buttons are working but not refreshing counts...
Where is the point that i missed out? Thank you!