nozominozonozo
@nozominozonozo

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Ruby × MySQL 】 投稿したユーザー名を表示したい(中間テーブル絡み)

解決したいこと

【Ruby × MySQL】
投稿する際にタグ付け出来る機能を実装しています。
投稿一覧を表示する際に投稿ユーザー名を表示したいです。

Ruby:2.6.5
Rails:6.0.3.6

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

エラーが出る前までに基本的な機能、投稿完了したら一覧で表示するまでは完了していたが、投稿者を表示したいと思いデータベースをロールバック、中間テーブルにuser_id、アソシエーショを記述してローカルで再度実行したらエラーが表示されました。

NameError in MemosController#create
undefined local variable or method `user' for #<MemoTag:0x00007fe1007ca8b0> Did you mean? user_id

a7a3cede12f2789df8be351968e65cd0.png

該当するソースコード

memos_controller.rb (投稿コントローラー)

class MemosController < ApplicationController

  def index
    @memos = Memo.all.order(created_at: :desc)
  end

  def new
    @memo = MemoTag.new
  end

  def create
    @memo = MemoTag.new(memo_params)
    if @memo.valid?
      @memo.save
      binding.pry
      return redirect_to root_path
    else
      render "new"
    end
  end

    private
    def memo_params
      params.require(:memo_tag).permit(:tag_name, :memo_content)
    end
end

memo_tag.rb (中間テーブルレコード)

class MemoTag 

  include ActiveModel::Model 
  attr_accessor :tag_name, :memo_content

  with_options presence: true do
    validates :tag_name
    validates :memo_content
  end

  def save
   memo = Memo.create(memo_content: memo_content, user_id: user.id)
    tag = Tag.create(tag_name: tag_name)

    MemoTagRelation.create(tag_id: tag.id, memo_id: memo.id, user_id: user.id)
  end
end

index.html.erb (投稿一覧表示ページ)

<div class="header">
  <div class="inner-header">
    <h1 class="title">
      Like Share Tag
    </h1>
    <li class="new-post"> 
      <%= link_to "NEW post",  new_memo_path %>
    </li>
  </div>
</div>

<!-- 投稿タグ表示 -->
<div class="main">
  <div class="message-wrap">
    <%= current_user.nickname %>
    <% @memos.each do |memo| %>
      <div class="tag">
        <p class="tag-list">
          <% memo.memo_content %>
        </p>
        <ul class="message">
          <li class="text">
            <% memo.tags.each do |tag| %>
              #<%= tag.tag_name %>
              by<%= tag.user.nickname %>
            <% end%>
          </li>
        <ul>
      </div>
    <% end %>
    <%= link_to "Back", :back %>
  </div>
</div>

README.md

## テーブル設計

## usersテーブル

| Column             | Type   | Options                 |
| ------------------ | ------ | ------------------------|
| name               | string | null:false              |
| name_kana          | string | null:false              |
| nickname           | string | null:false              |
| email              | string | null:false, unique:true |
| encrypted_password | string | null:false              |

### Association

- has_many :room_users
- has_many :rooms, through: :room_users
<!--- has_many :messages -->
- has_many :memos

## tagsテーブル

| Column   | Type       | Options                      |
| -------- | ---------- | ---------------------------- |
| tag_name | string     | null:false                   |

### Association

- has_many :memo_tag_relations
- has_many :memos, through: :memo_tag_relations

## memosテーブル

| Column       | Type       | Options                       |
| ------------ | -----------| ------------------------------|
| memo_content | string     | null:false                    |
| user         | references | null:false, foreign_key: true |

### Association

- has_many :memo_tag_relations
- has_many :tags, through: :memo_tag_relations
- belongs_to :user

## memo_tag_relations テーブル

| Column | Type       | Options                       |
| -------| ---------- | ----------------------------- |
| memo   | references | null:false, foreign_key: true |
| tag    | references | null:false, foreign_key: true |

### Association

- belongs_to :memo
- belongs_to :tag

自分で試したこと

paramsへuser_idをマージしても変わらず、binding.pryでデバックを行い止まっている箇所はわかった。パラメーターには過不足は無さそうだがfalseになっている。
memosとtagsテーブルにもアソシエーションが必要なのだろうか。

1eb9eb5c3c320dafb9e9219f6506362b.png

0

3Answer

MemoTag
MemoTagRelation.create(tag_id: tag.id, memo_id: memo.id, user_id: user.id)

ここのuserってどこから来てます? さらに言うとMemoTagRelationにもuser referenceがないっぽいですけど。

memo_tag_relations テーブル

Column Type Options
memo references null:false, foreign_key: true
tag references null:false, foreign_key: true
0Like

Comments

  1. @nozominozonozo

    Questioner

    ご回答ありがとうございます。失礼しました。
    ロールバックでuser_idを追加した際にREADMEへの記述を忘れておりました。
    memo_tag_relationsテーブルにuserカラムがあります。
class MemoTag 

  include ActiveModel::Model 

何れにしてもこのクラスはで使ってるuserオブジェクトはどこから来ていますか?そこが今エラーの原因だと思います。

今回のコードについて参考にしているサイトとかがありますか?

0Like

Comments

  1. @nozominozonozo

    Questioner

    ご回答ありがとうございます。
    ご指摘から紐づいているテーブルが違うと気付きました。
    投稿するmemosテーブルとuserテーブルとを紐付けました。
    また中間レコードへ以下を記述追加
     memo = Memo.create(memo_content: memo_content, user_id: user.id)
    しかしエラーは解決されませんでした。
    tagレコードのみデータが保存されています。

  def save
   memo = Memo.create(memo_content: memo_content, user_id: user.id)
    tag = Tag.create(tag_name: tag_name)

    MemoTagRelation.create(tag_id: tag.id, memo_id: memo.id, user_id: user.id)
  end

変更後でもこのメソッド内でuserは存在しないのでは?
現状このクラスでuser自体どこにも存在しないと思いますが。

0Like

Your answer might help someone💌