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

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

ただいまの
回答率

88.78%

画像タップでカテゴリー分け表示

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,664

tomtom1

score 130

投稿一覧ページにて、配置されているカテゴリ画像をタップすると、
その画像のカテゴリーを保有する投稿のみ一覧で表示する方法を知りたいです。

現在post/index.htmlにて全てのポストが一覧できるような状況です。
各ポストはカテゴリー:idを保有しておりますが、ポスト一覧の上部分に、三つの画像を配置し、
その画像がタップされると、その画像が保有するcategory_idと、
同じcategory_idを保有するポストのみを一覧するということがしたく存じます。

    <img src= "/icon/movie.png" >
    <img src= "/icon/drama.png" >
    <img src= "/icon/anime.png" >


こちらを、

<%= link_to(image_tag("/icon/movie.png"), リンクのパス) %>


上記のようなリンクパスを与え、またそれに加えて:id値を与えて、
コントローラーに飛ばしてカテゴリ表示を考えています。

PostControllerには下記のような記載があります。
(今まではPost.allでしたが、nameで検索するサーチに機能もあるためこのようになっています。)

def index
    @posts = Post.search(params[:id]).order(created_at: :desc)
  end


現状コントローラーはこのような状態ですが、取得はできていません。
Postとリレーションを持つCategoryモデルには下記のようになっています。

class Category < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  belongs_to :user
  belongs_to :category
  def user
    return User.find_by(id: self.user_id)
  end
  def index
    @posts = Project.search(param[:search])
  end
  def self.search(search)
    if search
      Post.where(['name LIKE ?', "%#{search}%"])
    else
      Post.all
    end
  end
  end


View内にnameで検索するテキストサーチも入っているため、少々複雑になっています。

<Category id: 1, name: "movie", created_at:xx, updated_at:xx>
<Category id: 2, name: "drama", created_at:xx, updated_at:xx>
<Category id: 3, name: "anime", created_at:xx, updated_at:xx>
 #<Post id: 1, title: "xx",, user_id: 1, category_id: 1 created_at: xx, updated_at: xx>


自分では現状このような状況です。
どのような方法でも宜しいので、ご教示頂ければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

おそらくその書き方からして、画像はPostテーブルとは無関係ということでしょうか?
その場合はviewにある リンクのパスcategory_path(飛ばしたいcategoryのid)に置き換えれば終了かと思います。

もし画像がPostテーブルのカラムに保存されているものである場合は、

modelで

class Post < ApplicationRecord
  belongs_to :cateogry
end


として、viewで

<%= link_to image_tag(@post.image), category_path(@post.category)


としてください。

質問の内容にあるControllerが何のコントローラーをさしているのか定かではありませんが(@postsとあることからposts_controllerと推測できますが)、上記のいずれにしろ、categories_controllerのshowアクションがあれば十分です。

class CategoriesController < ApplicationController
  def show
    @category = Category.find(params[:id])
  end
end


とすればうまくいくかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/20 21:23

    (エラーとは関係ない気もしますが、categoryというメソッド名はよくないですね。)

    一旦
    コントローラーの@postsを
    @posts = Post.where(category_id: params[:category_id])
    として、
    http://localhost:3000/posts/index?category_id=1
    にアクセスしたら正しい結果は表示されますか?

    キャンセル

  • 2018/11/21 12:36

    ご回答ありがとうございます。
    @posts = Post.where(category_id: params[:category_id])にしまして、
    http://localhost:3000/posts/index?category_id=1にアクセスしましたところ、
    カテゴリid=1の投稿のみと限定されず、すべてが一覧されました。

    キャンセル

  • 2018/11/21 14:12 編集

    度々失礼します。何度かいじる中反映がみられなかったため、サーバー再起動すると、
    変更が反映されるという事に気付きました。サーバー再起動しながら確認しましたところ、

    @posts = Post.where(category_id: params[:category_id])で、
    http://localhost:3000/posts/index?category_id=1にアクセスした場合、
    category_id:1を保有するポストの一覧に成功しました。ありがとうございます!

    キャンセル

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

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

関連した質問

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