タグ付け機能を実装したのチャットアプリの作成をしております。
タグ検索をransackを導入し実装を行ったのですが、タグに紐づくツイートidを一緒に取得することができず、ツイートに紐づいていない検索となってしまっています。
検索時にツイートidを紐付け、検索結果にタグに紐づいたツイートも反映させられるようにしたいです。
タグ検索に seekアクションを定義しました。
Tagテーブル
Ruby
1 class CreateTags < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tags do |t| 4 t.string :name, null:false, uniqueness: true 5 t.timestamps 6 end 7
tweetテーブル
Ruby
1class CreateTweets < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tweets do |t| 4 t.string :message, null:false 5 t.timestamps 6 end
tweet_tag_relationsテーブル
Ruby
1 class CreateTweetTagRelations < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tweet_tag_relations do |t| 4 t.references :tweet, foreign_key: true 5 t.references :tag, foreign_key: true 6 t.timestamps 7 end
アソシエーション
Tagモデル
Ruby
1 class Tag < ApplicationRecord 2 has_many :tweet_tag_relations 3 has_many :tweets, through: :tweet_tag_relations
tweetモデル
Ruby
1class Tweet < ApplicationRecord 2 has_many :tweet_tag_relations,dependent: :destroy 3 has_many :tags, through: :tweet_tag_relations
tweet_tag_relationsモデル
Ruby
1 class TweetTagRelation < ApplicationRecord 2 belongs_to :tweet 3 belongs_to :tag
tweetsコントローラー
Ruby
1 class TweetsController < ApplicationController 2 before_action :move_to_index, except: [:index, :show, :search, :seek] 3 before_action :set_q, only: [:index, :seek] 4 5 def index 6 @tweets = Tweet.includes(:user).order(created_at: :desc).limit(20) 7 @like = Like.new 8 end 9 10 def new 11 @tweet = TweetsTag.new 12 end 13 14 def show 15 @tweet = Tweet.find(params[:id]) 16 @comment = Comment.new 17 @comments = @tweet.comments.includes(:user) 18 end 19 20 def create 21 @tweet = TweetsTag.new(tweet_params) 22 if @tweet.valid? 23 @tweet.save 24 return redirect_to root_path 25 else 26 render "new" 27 end 28 end 29 30 def look 31 @tweets = Tweet.search(params[:keyword]) 32 end 33 34 def search 35 return nil if params[:keyword] == "" 36 tag = Tag.where(['name LIKE? ', "%#{params[:keyword]}%"] ) 37 render json:{ keyword: tag } 38 end 39 40 def seek 41 @results = @q.result(distinct: true).includes(:tweets) 42 @tweet = Tweet.find(params[:tweet_id]) 43 end 44 45 def destroy 46 tweet = Tweet.find(params[:id]) 47 tweet.destroy 48 redirect_to root_path 49 end 50 51 private 52 53 def set_q 54 @q = Tag.ransack(params[:q]) 55 end 56 57 def tweet_params 58 params.require(:tweets_tag).permit(:message,:name).merge(user_id: current_user.id) 59 end 60 61 def move_to_index 62 unless user_signed_in? 63 redirect_to action: :index 64 end 65 end 66end 67
routes.rb
Ruby
1 Rails.application.routes.draw do 2 devise_for :users 3 root to: 'tweets#index' 4 resources :tweets, only: [:index, :new, :show, :create, :destroy] do 5 collection do 6 get 'seek' 7 end 8 collection do 9 get 'look' 10 end 11 collection do 12 get 'search' 13 end 14 resources :comments, only: [:create] 15 resources :likes, only: [:create, :destroy] 16 end 17end 18
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
ActiveRecord::RecordNotFound in TweetsController#seek Couldn't find Tweet without an ID
該当のソースコード
@tweet = Tweet.find(params[:tweet_id])
試したこと
検索結果にincludesメソッドを使用してtweetsと紐づけたのですが、紐づいてくれません。
tweetsコントローラー
Ruby
1 @results = @q.result(distinct: true).includes(:tweets)
不足な点がありましたらご指摘お願いいたします。
ご教示のほど、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。