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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

1回答

3445閲覧

[Ruby][Rails]投稿した記事をカテゴリー別で一覧表示できるようにしたい

r_tech

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/23 12:25

実現したいこと

悩みを投稿できる投稿サイトのようなものを作成しています。
投稿する際に、タイトル・本文・カテゴリー(悩みの種類)を入力する必要があります。
投稿された記事にはlink_toメソッドを用いて、カテゴリーにリンク付けており、このリンクをクリックすると同じカテゴリーの投稿だけが一覧で表示されるようにしたいです

発生している問題

クリックしたカテゴリーのIDを取得することができません。
categoryメソッドを自作し、whereメソッドを用いて表示させようと実装しているのですが、引数としてクリックしたカテゴリーのIDが取得できず、nilとなります。

試したこと

app/controllers/tweets_controller.rb

ruby

1def category 2 @category = Tweet.find_by(category_id: params[:category_id]) 3 @tweets = Tweet.category 4end

app/models/tweet.rb

ruby

1 2def self.category 3 Tweet.where(category_id: @category ) 4end

このように記述し、投稿のカテゴリーのリンクをクリックした時にそのcategory_idを取得して@categoryに代入し、whereメソッドに引数として渡すことで一覧表示させようとしたのですが、上手くいきませんでした。
binding.pryで処理を止めて、@categoryの中身を調べてみると、nilとなっていました。

ruby

1Started GET "/tweets/category" for ::1 at 2020-11-23 21:13:42 +0900 2Processing by TweetsController#category as HTML 3 User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 4 5From: /Users/tanaberyo/projects/support-app/app/controllers/tweets_controller.rb:53 TweetsController#category: 6 7 52: def category 8 => 53: binding.pry 9 54: @category = Tweet.find_by(category_id: params[:category_id]) 10 55: @tweets = Tweet.category 11 56: end 12 13[1] pry(#<TweetsController>)> params 14=> <ActionController::Parameters {"controller"=>"tweets", "action"=>"category"} permitted: false> 15[2] pry(#<TweetsController>)> @category = Tweet.find_by(category_id: params[:category_id]) 16 Tweet Load (0.5ms) SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`category_id` IS NULL LIMIT 1 17(pry):2:in `category' 18=> nil 19[3] pry(#<TweetsController>)> @category 20=> nil 21[4] pry(#<TweetsController>)> @tweets = Tweet.categoryStarted GET "/tweets/category" for ::1 at 2020-11-23 21:14:42 +0900 22[4] pry(#<TweetsController>)> @tweets = Tweet.category 23 Tweet Load (0.5ms) SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`category_id` IS NULL 24 ↳ app/controllers/tweets_controller.rb:53:in `category' 25=> [] 26

whereメソッドの引数の@categoryの部分に存在するID値を手入力するとそのIDを持った投稿一覧が表示されるので、問題はカテゴリーのリンクをクリックした時にそのcategory_idを取得できていないことだと考えています。

私の力不足でここまでしか実装することができていません。
どうすれば正しいIDを取得できますでしょうか。
何卒よろしくお願いいたします。

app/controllers/tweets_controller.rb

ruby

1class TweetsController < ApplicationController 2 before_action :set_tweet, only: [:show, :edit, :update, :destroy] 3 before_action :move_to_index, only: :edit 4 5 def category 6 @category = Tweet.find_by(category_id: params[:category_id]) 7 @tweets = Tweet.category 8 end 9 10 private 11 12 def tweet_params 13 params.require(:tweet).permit(:title, :text, :category_id).merge(user_id: current_user.id) 14 end 15 16 def set_tweet 17 @tweet = Tweet.find(params[:id]) 18 end 19 20 def move_to_index 21 redirect_to root_path unless current_user.id == @tweet.user_id 22 end 23end 24

app/models/tweet.rb

ruby

1 2class Tweet < ApplicationRecord 3 extend ActiveHash::Associations::ActiveRecordExtensions 4 belongs_to_active_hash :category 5 6 belongs_to :user 7 has_many :comments, dependent: :destroy 8 has_many :likes 9 has_many :liked_users, through: :likes, source: :user 10 11 with_options presence: true do 12 validates :title 13 validates :text 14 validates :category_id, numericality: { other_than: 1, message: 'を選択してください' } 15 end 16 17 def self.search(search) 18 if search != '' 19 Tweet.where('text LIKE(?)', "%#{search}%") 20 else 21 Tweet.all 22 end 23 end 24 25 def self.category 26 Tweet.where(category_id: @category ) 27 end 28end 29

config/routes.rb

ruby

1Rails.application.routes.draw do 2 3 root to: "tweets#index" 4 resources :tweets, except: :index do 5 resources :comments, only: [:create, :destroy] 6 collection do 7 get 'search' 8 get 'category' 9 end 10 resource :likes, only: [:create, :destroy] 11 end 12 resources :users, only: :show 13end

ルーティング

Prefix Verb URI Pattern Controller#Action root GET / tweets#index tweet_comments POST /tweets/:tweet_id/comments(.:format) comments#create tweet_comment DELETE /tweets/:tweet_id/comments/:id(.:format) comments#destroy search_tweets GET /tweets/search(.:format) tweets#search category_tweets GET /tweets/category(.:format) tweets#category tweet_likes DELETE /tweets/:tweet_id/likes(.:format) likes#destroy POST /tweets/:tweet_id/likes(.:format) likes#create tweets POST /tweets(.:format) tweets#create new_tweet GET /tweets/new(.:format) tweets#new edit_tweet GET /tweets/:id/edit(.:format) tweets#edit tweet GET /tweets/:id(.:format) tweets#show PATCH /tweets/:id(.:format) tweets#update PUT /tweets/:id(.:format) tweets#update DELETE /tweets/:id(.:format) tweets#destroy user GET /users/:id(.:format) users#show rails_postmark_inbound_emails POST

app/views/tweets/category.erb

ruby

1 <% @tweets.each do |tweet| %> 2 <div class="card p-5 mb-3 border border-info" style="background-color:#fffafa;" > 3 <div class="text-right"> 4 <%= link_to '詳細', tweet_path(tweet.id), class: "card-link" %> 5 <% if user_signed_in? && current_user.id == tweet.user_id %> 6 <%= link_to '編集', edit_tweet_path(tweet.id), class: "card-link" %> 7 <%= link_to '削除', tweet_path(tweet.id), method: :delete, class: "card-link" %> 8 <% end %> 9 </div> 10 11 <h2><%= tweet.title %></h2> 12 <p class="mt-2"><%= tweet.text %></P> 13 <ul class="list-inline"> 14 <%= link_to "/users/#{tweet.user.id}" do %> 15 <li class="list-inline-item"><%= tweet.user.nickname %></li> 16 <% end %> 17 <li class="list-inline-item"><%= tweet.user.age.name%></li> 18 <li class="list-inline-item"><%= tweet.user.gender.name%></li> 19 <li class="list-inline-item"><%= tweet.user.occupation.name %></li> 20 <li class="list-inline-item ml-4 mr-5">悩み:<%= tweet.category.name %></li> 21 <li id="likes_buttons_<%= tweet.id %>", class="list-inline-item"> 22 <%= render partial: 'likes/like', locals: {tweet: tweet} %> 23 </li> 24 </ul> 25 </div> 26 <% end %> 27 </div> 28</div>

app/views/tweets/show.erb

ruby

1<%= render "shared/header" %> 2<div class="position-relative" style="top:100px" > 3 <div class="container"> 4 <div class="card border-success" style="background-color:#fffafa;"> 5 <div class="card-body p-5"> 6 <% if user_signed_in? && current_user.id == @tweet.user_id %> 7 <div class="text-right"> 8 <%= link_to '編集', edit_tweet_path, class: "card-link" %> 9 <%= link_to '削除', tweet_path, method: :delete, class: "card-link" %> 10 </div> 11 <% end %> 12 <h3 class="card-title mb-4"><%= @tweet.title %></h3> 13 <p class="card-text"><%= @tweet.text %></p> 14 <ul class="list-inline"> 15 <%= link_to "/users/#{@tweet.user.id}" do %> 16 <li class="list-inline-item"><%= @tweet.user.nickname %></li> 17 <% end %> 18 <li class="list-inline-item ml-2"><%= @tweet.user.age.name %></li> 19 <li class="list-inline-item"><%= @tweet.user.gender.name %></li> 20 <li class="list-inline-item"><%= @tweet.user.occupation.name %></li> 21 <%= link_to "/tweets/category" do %> 22 <li class="list-inline-item ml-4 mr-5" id="worry">悩み:<%= @tweet.category.name %></li> 23 <% end %> 24 25 <li id="likes_buttons_<%= @tweet.id %>", class="list-inline-item ml-5" > 26 <%= render partial: 'likes/like', locals: {tweet: @tweet} %> 27 </li> 28 29 </ul> 30 </div> 31 </div> 32 </div> 33</div>

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

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

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

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

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

winterboum

2020/11/24 01:39

viewのどこをclickするのですか?
r_tech

2020/11/24 01:49 編集

ご質問ありがとうございます。 app/views/tweets/show.erbのviewの <%= link_to "/tweets/category" do %> <li class="list-inline-item ml-4 mr-5" id="worry">悩み:<%= @tweet.category.name %></li> <% end %> ここの部分をクリックすることで、app/views/tweets/category.erbに遷移し、クリックしたcategory_idと同じcategory_idを持った投稿を一覧表示できるように実装したいと考えています。
guest

回答1

0

link_to category_tweets_path(@tweet.category)

投稿2020/11/24 02:18

winterboum

総合スコア23372

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

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

r_tech

2020/11/24 03:28

ご回答いただきありがとうございます。 ``` link_to category_tweets_path(@tweet.category) ``` と記述したところ、/tweets/category.7というようなパスになり、投稿が表示されません。 binding.pryで止めてみたところ、@categoryの値はnilになります。
winterboum

2020/11/26 05:42

routes に問題ありますね。 only で絞りすぎてます showも通してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問