前提・実現したいこと。
RubyOnRailsで掲示板を作っています。
掲示板(メッセージのindex)に表示させたいのは以下の5つです
①ユーザーID
②ユーザー名(メッセージを投稿した人の名前)
③メッセージのタイトル
⑤メッセージの内容
②を表示させることができません。
(current_userにはできますが、
そうすると当然ですがどのメッセージもログインしているユーザーの名前になってしまいます
今、仮置きで「index.html」に「@user」と記載していますが、画面上は空欄です。
メッセージを投稿した人の名前を表示させたいです)
発生している問題・エラーメッセージ
エラーメッセージ
Railsのエラーは以下のものが表示されています。
User must exist
該当のソースコード
RubyOnRails
ソースコード
「messages_controller.rb」
class MessagesController < ApplicationController
before_action :set_message, only: [:show, :edit, :update, :destroy]
before_action :require_user_logged_in, only: [:index, :show,:new,:new,:create, :edit, :update, :destroy ]
def index
@messages = Message.order(id: :desc).page(params[:page])
end
def show
@message = Message.find_by(id: params[:id])
end
def new
@message = Message.new
@message.user_id = current_user.id
@message.save
end
def create
@message = Message.new(message_params)
if @message.save flash[:success] = 'Message が正常に投稿されました' redirect_to @message else flash.now[:danger] = 'Message が投稿されませんでした' render :new end
end
def edit
end
def update
if @message.update(message_params) flash[:success] = 'Message は正常に更新されました' redirect_to @message else flash.now[:danger] = 'Message は更新されませんでした' render :edit end
end
def destroy set_message @message.destroy flash[:success] = 'Message は正常に削除されました' redirect_to messages_url end
private
def set_message @message = Message.find(params[:id]) end
#Strong Parameter
def message_params
params.require(:message).permit(:content, :title)
end
end
「index.html」
<h1>メッセージ一覧 <%= link_to '新規メッセージの投稿', new_message_path, class: "btn btn-primary" %></h1><% if @messages.any? %>
<table class="table table-striped"> <thead> <tr> <th>id</th> <th>ユーザー名</th> <th>タイトル</th> <th>メッセージ</th> </tr> </thead> <tbody> <% @messages.each do |message| %> <tr> <td><%= link_to message.id, message %></td> <th><%= @user %></th> <td><%= message.title %></td> <td><%= message.content %></td> </tr> <% end %> </tbody> </table> <div> <%= paginate @messages %> </div> <% end %>「message.rb」
class Message < ApplicationRecord
belongs_to :user
validates :content, presence: true, length: { maximum: 255 }
validates :title, presence: true, length: { maximum: 255 }
end
試したこと
「index.html」に「@user」と記載している箇所はmessage.user.nameなどと記載しましたが
「undefined method `name' for nil:NilClass」のエラーが表示されました。
補足情報(FW/ツールのバージョンなど)
テーブルは以下のようになっています
describe messages;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| content | varchar(255) | YES | | NULL | |
| user_id | bigint(20) | YES | MUL | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| title | varchar(255) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
mysql> describe users;
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
| password_digest | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+-----------------+--------------+------+-----+---------+----------------+
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/03 06:21
2021/01/03 06:30
2021/01/03 06:50
2021/01/03 07:02
2021/01/03 07:22