🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

2342閲覧

Ruby 6 ransack使用 タグ検索機能に、紐づくtweetのidも付与して検索できるようにしたい

syosinsya-mark

総合スコア3

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/03/19 03:07

編集2021/03/20 08:36

タグ付け機能を実装したのチャットアプリの作成をしております。
タグ検索を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)

不足な点がありましたらご指摘お願いいたします。
ご教示のほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

TagをTweetにすることで、解決することができました。

Ruby

1 def set_q 2 @q = Tweet.ransack(params[:q]) 3 end

投稿2021/03/23 10:10

syosinsya-mark

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問