実現したいこと
悩みを投稿できる投稿サイトのようなものを作成しています。
投稿する際に、タイトル・本文・カテゴリー(悩みの種類)を入力する必要があります。
投稿された記事には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>