前にポストしたユーザー機能と投稿機能の続き。今度はユーザーと投稿を紐付ける。大枠としてはポストのDBにユーザーのidカラムを準備し、誰が投稿したかを分かるようにする。
postsテーブルにuser_idカラムを追加
- rails g migrationでファイルを追加
- マイグレーションファイルのchangeメソッドにカラムを追加する旨記載
- rails db:migrateでマイグレーションファイルを反映
投稿時にuser_idをDBに保存する
userの値が現在ログインしているユーザーのものになるようにする。
test
def create
@post = Post.new(
content: params[:content],
user_id: @current_user.id
)
end
@current_user.idは下記で引っ張ってくる。これはapplication_controller.rbに記載し、どこでも使えるようにする。
test
before_action :set_current_user
def set_current_user
@current_user = User.find_by(id: session[:user_id])
end
投稿にユーザー名を表示したい時
test
def show
@post = Post.find_by(id: params[:id])
# 変数@userを定義してください
@user = User.find_by(id: @post.user_id)
end
@postにユーザー情報を入れ、そのユーザー情報のidを@userに入れる。今回は投稿に紐付いているユーザー名を表示なので投稿の情報からuser_idをひっぱり、それからuser情報をひっぱる。
投稿者だけが編集・削除ができるようにする
投稿者だけが編集できるようにensure_correct_userという現在のuser_idと投稿者のidが一致していないとはじくメソッドを作る。posts_controllerに作成する。どのcontrollerかはどのviewで制御するのかによる。controllerをまたぐ場合はapplicationで設定したほうが良さそう。
post_controller
def ensure_correct_user
@post = Post.find_by(id:params[:id])
if @post.user_id != @current_user.id
flash[:notice] = "権限がありません"
redirect_to("/posts/index")
end
postクラスからuser_idをUserクラスから作ったcurrent_userからはidを取得しそれが一致していない場合、indexに飛ばすように設定。