messageモデルとuserモデルのアソシエーションができない
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 2,147
前提・実現したいこと
messageモデルとuserモデルのアソシエーションで、messageに紐づくユーザーの名前を書き出したい
発生している問題・エラーメッセージ
user.nameが定義されていないと出てしまう
Showing /Users/ryousuke/projects/chat-space/app/views/messages/_message.html.haml
undefined method `name' for 3707:Fixnum
Trace of template inclusion: app/views/messages/index.html.haml
該当のソースコード
//eachで変数を定義
.right-content__messages.clearfix
.right-content__messages__container
.right-content__messages__box
-@messages.each do |message| ←変数定義
= render partial:"message", locals:{message: message}
//部分テンプレで切り出し
.right-content__messages__box
.right-content__messages__box__username
%h4 #{message.user_id.name}←問題の箇所
.right-content__messages__box__time
%p #{message.created_at}
.right-content__messages__box__content
%p #{message.content}
試したこと
・アソシエーションの確認
・外部キーの設定
・DB内データの有無確認
補足情報(FW/ツールのバージョンなど)
class MessagesController < ApplicationController
def index
@groups = current_user.groups
@group = Group.find(1)
@messages = Message.where(group_id: params[:group_id]).order("created_at ASC")
end
end
class Message < ApplicationRecord
belongs_to :user
belongs_to :group
end
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :messages
has_many :group_users
has_many :groups, through: :group_users
end
ActiveRecord::Schema.define(version: 20180507143441) do
create_table "group_users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.integer "group_id"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["group_id"], name: "index_group_users_on_group_id", using: :btree
t.index ["user_id"], name: "index_group_users_on_user_id", using: :btree
end
create_table "groups", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.string "name", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["name"], name: "index_groups_on_name", using: :btree
end
create_table "messages", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.text "content", limit: 65535, null: false
t.string "image"
t.integer "user_id", null: false
t.integer "group_id", null: false
t.index ["group_id"], name: "fk_rails_841b0ae6ac", using: :btree
t.index ["user_id"], name: "fk_rails_273a25a7a6", using: :btree
end
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.string "name", null: false
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
end
add_foreign_key "group_users", "groups"
add_foreign_key "group_users", "users"
add_foreign_key "messages", "groups"
add_foreign_key "messages", "users"
end
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
Fixnumにnameというメソッドは生えていない、というエラーメッセージですね
見た感じ message.user_id.name ではなく message.user.name とすると正しく動きそうです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
早速試してみたところ、解決しました!
迅速なご回答ありがとうございます!
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/05/08 00:22
迅速なご回答ありがとうございます!