75613


レシピを投稿した際にいいねの数でランキングを表示しようとしています。  
ランキング表示といいね機能はできたのですが  
以下のように１位と2位に同じレシピが表示されてしまいます。

原因としては＠cookingsの中身が毎回同じものなのでここを解消すればなんとかなると思うのですがその解決方法がわかりません。

何か追加して欲しい情報があれば追加しますのでよろしくお願いします。

* * *

**現在の表示結果:**

[![画像の説明をここに入力](https://i.stack.imgur.com/PCSmw.jpg)](https://i.stack.imgur.com/PCSmw.jpg)

### ソースコード

クッキングコントローラーのrankingアクション

[code]

    def ranking
        @all_ranks = Cooking.find(Like.group(:cooking_id).order('count(cooking_id) DESC').limit(3).pluck(:cooking_id))
        @cookings = Cooking.order("created_at DESC")
      end
    
[/code]

likesコントローラー (いいね機能を実装)

[code]

    class LikesController < ApplicationController
      def create
        @like = current_user.likes.create(cooking_id: params[:cooking_id])
        redirect_back(fallback_location: root_path)
      end
    
      def destroy
        @cooking = Cooking.find(params[:cooking_id])
        @like = Like.find_by(cooking_id: @cooking.id)
        @like.destroy
        redirect_back(fallback_location: root_path)
      end
    end
    
[/code]

ranking.html.erb

[code]

    <div class="border"></div>
    <div class='cooking-card-contents'>
      <h2 class='title'>レシピランキング</h2>
       <% @all_ranks.each.with_index(1) do |cooking, i| %>
          第<%= i %>位
         <%= render partial: "cooking", local:{ cooking: @cookings} %>
      <% end %>
    </div>
    
[/code]

_cooking.html.erb

[code]

    <ul class='cooking-lists'>
      <% @cookings.each do |cooking|%>
        <li class='list'>
         <div class="slider">
          <% cooking.images.each do |image| %>
          <div class='cooking-img-content'>
           <%= link_to image_tag(image, class: 'sized'), cooking_path(cooking.id) %>
          </div>
          <% end %>
         </div>
         <div class="cooking-info">
           <h3 class="recipe-name"><%= cooking.cooking_name %></h3>
           <h3 class="recipe-time"><%= cooking.production_time %></h3>
         </div>
        </li>
      <% end %>
    </ul>
    
[/code]


CC BY-SA 4.0
2021-04-29T09:51:15.473
75577
2021-05-01T08:05:38.920
2021-04-30T13:53:25.023
45049
45049
question
ruby-on-rails ruby html
rails いいね順のランキング機能を実装したいがランキング画面で同じものが表示されてしまう問題を解消したい。


まず、`_cooking.html.erb`についてです。このパーシャルは個別のCookingを表示するためのものですので、内部で`each`（繰り返し）を使う必要はありません。

`_cooking.html.erb`

[code]

    <li class='list'>
      <div class="slider">
      <% cooking.images.each do |image| %>
      <div class='cooking-img-content'>
        <%= link_to image_tag(image, class: 'sized'), cooking_path(cooking.id) %>
      </div>
      <% end %>
     </div>
     <div class="cooking-info">
       <h3 class="recipe-name"><%= cooking.cooking_name %></h3>
       <h3 class="recipe-time"><%= cooking.production_time %></h3>
     </div>
    </li>
    
[/code]

ここでの変更は２つ、`<ul>`タグは個別のアイテムに付けるタグではないので取り除き、`@cookings.each`の行を削除しています。

`ranking.html.erb`

[code]

    <div class="border"></div>
    <div class='cooking-card-contents'>
      <h2 class='title'>レシピランキング</h2>
       <% @all_ranks.each.with_index(1) do |cooking, i| %>
          第<%= i %>位
          <ul>
            <%= render partial: "cooking", locals:{ cooking: cooking} %>
          </ul>
      <% end %>
    </div>
    
[/code]

こちらには、`<ul>`タグを追加し、`local`を`locals`に修正し（これはミスっぽいですね）、`@cookings`を`cooking`（`@all_ranks`の繰り返しで得られる`Cooking`オブジェクト）に修正しています。

これらの変更で想定どおりの動作になると思います。


CC BY-SA 4.0
2021-05-01T08:05:38.920
75613
2021-05-01T08:05:38.920
442
75577
answer