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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

424閲覧

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

tomtom1

総合スコア168

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/11/15 07:38

編集2018/11/16 06:49

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

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

view

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

こちらを、

view

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

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

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

Controller

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

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

Model

1class Category < ApplicationRecord 2 has_many :posts 3end 4 5class Post < ApplicationRecord 6 belongs_to :user 7 belongs_to :category 8 def user 9 return User.find_by(id: self.user_id) 10 end 11 def index 12 @posts = Project.search(param[:search]) 13 end 14 def self.search(search) 15 if search 16 Post.where(['name LIKE ?', "%#{search}%"]) 17 else 18 Post.all 19 end 20 end 21 end

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

DB

1<Category id: 1, name: "movie", created_at:xx, updated_at:xx> 2<Category id: 2, name: "drama", created_at:xx, updated_at:xx> 3<Category id: 3, name: "anime", created_at:xx, updated_at:xx>

DB

1 #<Post id: 1, title: "xx",, user_id: 1, category_id: 1 created_at: xx, updated_at: xx>

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

modelで

post.rb

1class Post < ApplicationRecord 2 belongs_to :cateogry 3end

として、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/16 03:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomtom1

2018/11/16 07:24

わざわざお時間をお作り頂き、そしてご回答ありがとうございます。 にも関わらず、質問のが具体的でなかったこと申し訳ありません。 改めて詳細を加えましたので、再度ご確認頂ければ幸いです。 また、画像はPublicのiconディレクトリの中に保存されています。
退会済みユーザー

退会済みユーザー

2018/11/16 08:26 編集

なるほど、最終的にpostを `name` で検索するように、(選択した) `category_id` で結果を絞れるようにしたいということですか?
tomtom1

2018/11/16 10:23

ご返信ありがとうございます。 postをnameで検索する機能は完成しており、それとは別でカテゴリー検索もできるようにしたいです。 また、name検索のtext欄に記入する方法とは異なり、カテゴリ検索は画像をタップすることにより、三種類のカテゴリーの中から属するカテゴリーのポストを一覧したいです。
退会済みユーザー

退会済みユーザー

2018/11/16 14:35 編集

そうすると、 def self.search(search)  if search   Post.where(['name LIKE ?', "%#{search}%"])  else   Post.all  end end と同様に def self.category(category_id)  if search   Post.where(category_id: category_id)  else   Post.all  end end のようなものをモデルで作り、nameで文字列を渡したのと同じように、category_idを飛ばし、 def index  @posts = Post.search(params[:id]).category(params[:category_id]).order(created_at: :desc) end のようにするというのはどうでしょうか?
tomtom1

2018/11/16 16:25

ありがとうございます! お教え頂いた内容を挑戦したく存じますが一点お伺いしたいです。 nameで文字列を渡す方法はテキストに記入する方法で値を渡していますが、 今回は画像であり、その画像をタップすることによりという別の方法です。 そこの方法に関しても、宜しければお教え頂ければ幸いです。度々で恐縮です。
退会済みユーザー

退会済みユーザー

2018/11/17 02:00 編集

例えば <%= link_to "/icon/anime.png", posts_path(category_id: #{i})%> のような感じでするとクエリでコントローラーに数字を渡すことができます。 URLバーをよく見ると http://localhost:3000/posts?category_id=3 となっています。こうすることでcategory_idはコントローラーで params[:category_id]として取得でき、それを使用することができます。
退会済みユーザー

退会済みユーザー

2018/11/17 02:02

ちなみに、検索機能は自分で作るととても勉強になりますが、部分一致、完全一致、以上、以下などの条件を色々考えると、なかなか大変です。そこでransackというgemを使えば一気に実装することができます。 https://github.com/activerecord-hackery/ransack 参考にしてみてください。
tomtom1

2018/11/18 05:22

上記についてお教えいただきありがとうございます。 実装してもまだエラーが出てきてしまう現状です。 自分ではまだ解決案が見出せずいおりますため、お力添え頂ければ幸いです。 Model def self.category(category_id)  if search   Post.where(category_id: category_id)  else   Post.all  end end をPost Modelに加えてもエラー発生無しです。 しかし、Post_Controllerに、 def index  @posts = Post.search(params[:search]).category(params[:category_id]).order(created_at: :desc) end に変更すると、 ArgumentError in PostsController#index wrong number of arguments (given 0, expected 1) というエラーが発生します。 また、View post/index内の画像にカテゴリキーを与えるとエラーが発生します。 エラー無し:<%= link_to( image_tag("/icon/anime.png"), "/posts/index") %> エラー有り:<%= link_to( image_tag("/icon/anime.png"), "/posts/index"(category_id: 1)%> エラー内容:syntax error, unexpected '(', expecting ')' ...con/meat.png"), "/posts/index"(category_id: 1));@output_buff... ... ^
退会済みユーザー

退会済みユーザー

2018/11/19 23:53

なるほど、link_toでpathを直接書いているのですね。そのやり方だと、()でクエリを引数として渡すことはできません ’/posts/index?category_id=1’ のように記述するしかありません。 controllerのエラーもおそらくはcategoryのところでエラーが起きていると考えられますが、念のため、category_idがコントローラーに渡っているかlogger.debugなどを使ってデバッグをしてみてください。 ちなみに、 「link_toでpathを直接書いている場合は」と申しましたが、Railsには「resources」という推奨されているルーティングの書き方があるのでそれを使用する方が良いかと思います。↓参考 https://railsguides.jp/routing.html#web%E4%B8%8A%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9
tomtom1

2018/11/20 01:44

ご丁寧に細かくお教えいただきありがとうございます。 現状下記のようになります。 <%= link_to( image_tag("/icon/anime.png"), ’/posts/index?category_id=1’ %> エラー:SyntaxError in PostsController#index しかし、下記のようにすればエラー無しで、 <%= link_to( image_tag("img.png"), controller: "posts", action: "index", category_id: 1) %> URLは「http://localhost:3000/posts/index?category_id=1」になりました。 しかし、一つ前にのコメントで記載した、ModelとControllerにコードを加えると、 やはり変わらず、同様のエラーが発生してしまいます。 また、Modelにdef self.category(category_id)を加えずに、Controllerに @posts = Post.search(params[:search]).category(params[:category_id]).order(created_at: :desc)を足したところ、下記のようなエラーが発生してしまいます。 NoMethodError in PostsController#index undefined method `category' for #<Post::ActiveRecord_Relation:0x00007fcba3dd4d90>
退会済みユーザー

退会済みユーザー

2018/11/20 12:23

(エラーとは関係ない気もしますが、categoryというメソッド名はよくないですね。) 一旦 コントローラーの@postsを @posts = Post.where(category_id: params[:category_id]) として、 http://localhost:3000/posts/index?category_id=1 にアクセスしたら正しい結果は表示されますか?
tomtom1

2018/11/21 05:44 編集

度々失礼します。何度かいじる中反映がみられなかったため、サーバー再起動すると、 変更が反映されるという事に気付きました。サーバー再起動しながら確認しましたところ、 @posts = Post.where(category_id: params[:category_id])で、 http://localhost:3000/posts/index?category_id=1にアクセスした場合、 category_id:1を保有するポストの一覧に成功しました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問