質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

【Ruby on Rails】投稿一覧ページにいいね機能をつけたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 510

score 17

前提・実現したいこと

投稿一覧ページにいいね機能をつけたい

発生している問題・エラーメッセージ

現在、投稿詳細ページ(show)にいいね機能を実装しております。
イメージ説明

投稿一覧ページ(index)に下記のソースコードを入力するとこのようなエラーが表示されます。
post_images/index.html.erb

<section class="sct-color-1 slice">
  <div class="container-fluid masonry-container">
    <div class="row">
      <div class="col-md-8 col-sm-offset-2">
        <div class="masonry-wrapper-cols">
          <div class="masonry-gutter"></div>
            <% @post_images.each do |post_image| %>
            <div class="masonry-block">
              <div class="block block-image v1">
                <div class="block-image">
                  <div class="view view-first">
                  <%= link_to post_image_path(post_image.id) do %>
                    <%= attachment_image_tag post_image, :image %>
                  <% end %>
                  </div>
                </div>
                <div class="block-content">
                  <%= attachment_image_tag post_image.user, :profile_image, size: "100x100", fallback: "no_image.jpg", class:"img-circle pull-left profile-thumb" %>
                  <h3 class="block-title">
                      <%= post_image.image_name %>
                  </h3>
                  <ul class="inline-meta">
                    <li>By
                      <%= post_image.user.name %>
                    </li>
                    <li>
                      <%= link_to "#{post_image.post_comments.count} コメント", post_image_path(post_image.id) %>


                    </li>
                    <% if @post_image.favorited_by?(current_user) %>
                      <li>
                        <%= link_to post_image_favorites_path(@post_image), method: :delete do %>
                          <i class="fa fa-star" aria-hidden="true" style="color: orange; font-size: 15px;"></i>
                          <%= @post_image.favorites.count %> ファイト
                        <% end %>
                      </li>
                    <% else %>
                      <li>
                        <%= link_to post_image_favorites_path(@post_image), method: :post do %>
                          <i class="fa fa-star" aria-hidden="true" style="font-size: 15px;"></i>
                          <%= @post_image.favorites.count %> ファイト
                        <% end %>
                      </li>


                    <% end %>
                  </ul>
                </div>
              </div>
            </div>
            <% end %>
            <%= paginate @post_images, class: "paginate" %>
        </div>
      </div>
    </div>
  </div>
</section>


エラー内容
イメージ説明

ソースコード

post_image.rb(model)

class PostImage < ApplicationRecord
    belongs_to :user
    attachment :image
    has_many :post_comments, dependent: :destroy
    has_many :favorites, dependent: :destroy
    validates :image_name, presence: true
    validates :image, presence: true
    def favorited_by?(user)
        favorites.where(user_id: user.id).exists?
    end
end

post_images_controller.rb(controller)

class PostImagesController < ApplicationController
    def new
        @post_image = PostImage.new
    end

    def create
        @post_image = PostImage.new(post_image_params)
        @post_image.user_id = current_user.id
        if @post_image.save
          redirect_to post_images_path
        else
          render :new
        end
    end

    def index
        @post_images = PostImage.page(params[:page]).reverse_order
    end

    def show
        @post_image = PostImage.find(params[:id])
        @post_comment = PostComment.new
    end

    def destroy
        @post_image = PostImage.find(params[:id])
        @post_image.destroy
        redirect_to post_images_path
    end

    private

    def post_image_params
        params.require(:post_image).permit(:image_name, :image, :caption)
    end
end

補足情報

定義されていないということは理解できるんですが、どう直せば表示されるのかがわかりません。
ご教示いただけると幸いです。

追記

@post_imagesをpost_imageにしたら投稿一覧にいいねボタンが表示されるようになりました。

新たなエラーとして、いいねを押すと詳細ページに飛んでしまいます。
link_to post_image_favorites_path(@post_image)
にしているためだと思われますが、indexのルートであるpost_images_pathと書いてもroutes errorが表示されてしまいます。
favorites_controller.rb(controller)

class FavoritesController < ApplicationController
    def create
        post_image = PostImage.find(params[:post_image_id])
        favorite = current_user.favorites.new(post_image_id: post_image.id)
        favorite.save
        redirect_to post_image_path(post_image)
    end

    def destroy
        post_image = PostImage.find(params[:post_image_id])
        favorite = current_user.favorites.find_by(post_image_id: post_image.id)
        favorite.destroy
        redirect_to post_image_path(post_image)
    end
end

Rails 5.2.4.1
ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-linux-gnu]

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

@post_imagesをpost_imageに変更したら投稿一覧にいいね機能の表示をすることができました。
原因はindex.html.erbでは<% @post_images.each do |post_image| %>のように@post_imagesをpost_imageという変数に格納していたため。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る