@prneet

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

投稿に紐づいたタグを表示

Q&A

Closed

投稿に紐づいたタグを表示したいです

Ruby on Railsで掲示板のようなWebアプリをつくっています。
タグ付機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

発生している問題・エラー

NoMethodError in Recruits#index
_recruit.html.erb where line #15 raised:

undefined method `tag_name' for #<Recruit:0x00007f8370072150>

該当するソースコード

<li class="recruit">
  <div class="upper-rec">
    <%= link_to recruit.name, recruit_path(recruit.id), class:"rec-user" %>
    <div class="rec-style">
      <%= recruit.style.name %>
    </div>
  </div>
  <div class="mid-rec">
    <div class="rec-plat"><%= recruit.contact.name %></div>
    <div class="rec-userid"><%= recruit.player_name %></div>
  </div>
  <div class="lower-rec">
    <ul class="rec-tags">
      <li class="rec-tag">
        <%= recruit.tag_name %>
      </li>
    </ul>
    <div class="rec-text">
      <%= recruit.text %>
    </div>
    <div class="rec-time">
      <%= recruit.created_at %>
    </div>
  </div>
</li>
class RecruitsController < ApplicationController
  before_action :set_recruit, only: [:show, :edit, :update, :destroy, :delete_with_pass]
  before_action :set_tag

  def index
    @recruits = Recruit.includes(:tags).order("created_at DESC")
  end

  def set_recruit
    @recruit = Recruit.find(params[:id])
  end

  def set_tag
    @tags = Tag.all 
  end
class Tag < ApplicationRecord
  has_many :recruit_tag_relations
  has_many :recruits, through: :recruit_tag_relations

  validates :tag_name, uniqueness: true
end

キャプチャ画面

4571d16889ac4fac817d76ffcbf13405.png

左のサイドバーには@tags.each do |tag| tag.tag_nameでタグ名を取得できましたが、投稿にこの記述をすると紐づいていないタグまで表示されてしまいます。

0 likes

1Answer

エラーで指摘されている行は、
<%= recruit.tag_name %> の部分です。

おそらく「該当するソースコード」の1つ目に貼られているソースコードは
_recruit.html.erbの一部分なのでしょう。

これより上の部分で @recruits をループで回していて、
その変数が recruitなのだと推測します。
recruit 1つが投稿1つに該当するのでしょう。

 
細かな設計は分かりませんが、直感でおかしいと感じるのは、recruit.tag_name です。
なぜなら、投稿1つにタグは複数付くのでしょう?

それならば、recruit.tags という変数がまずあり、
recruit.tags でループを回し、tag という変数に入れ、
tag.tag_name で表示するのが自然です。

 

左のサイドバーには@tags.each do |tag| tag.tag_nameでタグ名を取得できましたが、投稿にこの記述をすると紐づいていないタグまで表示されてしまいます。

「投稿」というのは、キャプチャ画像の右側にあるドラクエのウィンドウっぽい矩形のことですね。

そこに @tags.each do |tag| tag.tag_name と書いたら
投稿に紐付いていないタグまで表示されるのは当然です。

@tags という配列には、全てのタグが入っているのであって、
「現在の投稿に紐付いているか?」で絞っていないのですから。

 

  • 投稿に紐付いているかによらず、これまでに使った全てのタグの一覧が入っている @tags という変数
  • 投稿1つ1つについて、その投稿と紐付いているタグの一覧が入っている recruit.tags という変数

を混同しているように思えます。

RecruitとTagが多対多の関係ならば、
class Tag < ApplicationRecordhas_many :recruits するだけでなく、
class Recruit < ApplicationRecord にも has_many :tags すればいいです。

そうすれば、recruit.tags という変数が生えます。

recruit_tag_relations は必要ない気がします。

0Like

Comments

  1. @prneet

    Questioner

    タグ表示のeachメソッドの時点で
    recruit.tags.each do |tag|
    投稿に紐づいたタグの繰り返し処理で
    tag.tag_nameと表示する事で解決しました。ありがとうございました!

Your answer might help someone💌