0

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!

0 Answers0