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

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

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

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

Ruby on Rails 6

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

解決済

タグにユーザー情報を紐付けられない

AKIRA0310
AKIRA0310

総合スコア15

Ruby

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

Ruby on Rails 6

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

1回答

0評価

0クリップ

104閲覧

投稿2022/04/30 14:21

編集2022/05/01 08:36

前提・実現したいこと

タグ検索の機能を実装したいのですが、タグにユーザー情報を紐づけることができず、検索結果を表示できません。

発生している問題・エラーメッセージ

イメージ説明
該当のソースコード

routes.rb

ruby

devise_for :users root to: "profiles#index" resources :profiles resources :users, only: [:edit, :update] resources :messages, only: [:create] resources :rooms, only: [:create, :show] resources :tags do get "profiles", to: "profiles#search" end

profile.rb

ruby

class Profile < ApplicationRecord mount_uploader :image, ImageUploader belongs_to :user has_many :room_users, dependent: :destroy has_many :rooms, through: :room_users has_many :messages, dependent: :destroy has_many :profile_tags, dependent: :destroy has_many :tags, through: :profile_tags validates :nickname, presence: true def save_tag(sent_tags) current_tags = self.tags.pluck(:tag_name) unless self.tags.nil? old_tags = current_tags - sent_tags new_tags = sent_tags - current_tags old_tags.each do |old| self.tags.delete Tag.find_by(tag_name: old) end new_tags.each do |new| new_profile_tag = Tag.find_or_create_by(tag_name: new) self.tags << new_profile_tag end end end

tag.rb

ruby

class Tag < ApplicationRecord has_many :profile_tags, dependent: :destroy has_many :tags, through: :profile_tags end

profile_tag.rb

ruby

class ProfileTag < ApplicationRecord belongs_to :profile belongs_to :tag end

profiles_controller

ruby

before_action :set_profile, only: [:show, :edit, :update, :destroy] def index @profiles = Profile.all @tag_list = Tag.all end def new @profile = Profile.new end def create @profile = Profile.new(profile_params) tag_list = params[:profile][:tag_name].split(nil) if @profile.save @profile.save_tag(tag_list) redirect_to root_path else render :new end end def show @profile_tags = @profile.tags @sendUser = RoomUser.where(profile_id: current_user.id) @receiveUser = RoomUser.where(profile_id: @profile.id) unless @profile.user_id == current_user.id @sendUser.each do |su| @receiveUser.each do |ru| if su.room_id == ru.room_id @isRoom = true @roomId = su.room_id end end end unless @isRoom @room = Room.new @roomUser = RoomUser.new end end end def edit @tag_list = @profile.tags.pluck(:tag_name).join(', ') end def update tag_list = params[:profile][:tag_name].split(' ') @profile.update(profile_params) if @profile.save @profile.save_tag(tag_list) redirect_to profile_path(@profile.id) else render :edit end end def destroy @profile.destroy redirect_to root_path end def search @tag = Tag.find(params[:tag_id]) @profiles = @tag.profiles.all end private def profile_params params.require(:profile).permit(:image, :nickname, :comment, :content, :twitter, :instagram ).merge(user_id: current_user.id) end def set_profile @profile = Profile.find(params[:id]) end

search.html.erb

ruby

<div class='call-contents'> <h2 class='call-title'> <%= @tag.tag_name %>の検索結果 </h2> </div> <div class='user-lists'> <div class='user-list'> <% @profiles.each do |profile| %> <div class='user-wrapper'> <%= link_to profile_path(profile.id) do %> <% if profile.image? %> <%= image_tag profile.image.url, :size => '200x200' %> <% else %> <%= image_tag "/assets/default-user-icon.png", :size => '200x200' %> <% end %> <div class='user-body'> <div class='header_comment'> <%= profile.comment %> </div> <div class='user_name'> <%= profile.nickname %> </div> <p class='rating-star'> <%= image_tag "star-on.png" %> </p> </div> <% end %> </div> <% end %> </div> </div>

自分で調べたことや試したこと

profile_tagsテーブルにprofileとtagの外部キーを設定しているので、それぞれに紐づけられるはずなのですがノーメソッドエラーが出てしまいます。各モデルのアソシエーションやカラムを確認したのですが原因は見つけられませんでしたので@profilesの呼び出し方に問題があるような気がしているのですが、どう表記すべきなのでしょうか?どなたかご教授いただければ幸いです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails 6

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