ここでは、どのユーザーが呟いたツイートなのか区別できるよう機能を追加する。
- テーブルにカラムを追加する方法(復習)
- ツイートの保存内容を追加する方法
ツイートにユーザー情報を追加する
現在ユーザーが投稿したツイートはどのユーザーが投稿したものなのかわからない状態になっている。
これがわかるようになると、特定のユーザーがつぶやいたツイート一覧を取得できたり、ツイートの削除を行う際につぶやいた本人しか削除できないように設定できたりと色々便利である。
そこで、本項ではツイートにユーザーの情報を追加して、誰が投稿したツイートなのかが分かるようにする。
作業内容
- tweetsテーブルにカラムを追加する
- ツイート保存時にユーザー情報を追加する処理を記述する
- ツイート保存時にユーザー情報も保存できたか確かめる
1.tweetsテーブルにカラムを追加する
ツイートにユーザーの情報を追加する場合、tweetsテーブルに新しくuser_idというカラムを作成し、そこにツイートを投稿したユーザーのidを入れる。
カラムの追加の手順はnicknameカラムを追加した際と同様である。
tweetsテーブルにuser_idカラムをinteger型で追加する
$ rails g migration AddUserIdToTweets user_id:integer # tweetsテーブルにuser_idカラムをinteger型で追加するマイグレーションファイルの作成 $ rails db:migrate # マイグレーションファイルの実行
新規作成されるファイル
db/migrate/201XXXXXXXXXXX_add_user_id_to_tweets.rb
tweetsテーブルを開き「user_id」のカラムが作成されているか確認する。
2.ツイート保存時にユーザー情報を追加する処理を記述する
上記の作業でtweetsテーブルにカラムが追加された。
そこで今回はツイートの保存時に投稿したユーザーのidをテーブルに保存する処理を記述する。
current_user
deviseでログイン機能を実装すると、current_userというヘルパーメソッドを使用することができる。
これは、現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッドである。
例えば、usersテーブルでのidカラムの値が1のアカウントでログインしている場合、current_userはUser.find(1)と同じ意味を持つ。
この時、current_user.usersテーブルのカラム名とすることで、ログイン中のユーザーの情報として登録されている各カラムの値を取得することができる。
ツイートを投稿したユーザーとはつまり現在ログインしているユーザーのことである。
そのため、tweetsテーブルのuser_idカラムに保存すべきなのはcurrent_userのidカラムの値である。
実際にツイートをテーブルに保存する処理が書かれているのはtweets_controllerのcreateアクションである。
現在は、以下のようになっている。
app/controllers/tweets_controller.rb
class TweetsController < ApplicationController before_action :move_to_index, except: :index def index @tweets = Tweet.all end def new end def create Tweet.create(tweet_params) end private def tweet_params params.permit(:name, :image, :text) end def move_to_index redirect_to action: :index unless user_signed_in? end end
ツイートを保存する際、name、image、textというビューから送られてくる情報に加えて、user_idカラムにログイン中のユーザーのidを保存しなければならない。
そこで、createメソッドの引数をcreate(カラム名: 保存する値, カラム名: 保存する値, …)と変更する必要がある。
この時、name、image、textを保存する際にはtweet_paramsというストロングパラメーターを使用する。
tweet_paramsはハッシュの形のため、tweet_params[:キーの名前]とすることでそのキーのバリューの値を取ることができる。
すると、以下のように書くことができる。
app/controllers/tweets_controller.rb
class TweetsController < ApplicationController before_action :move_to_index, except: :index def index @tweets = Tweet.all end def new end def create Tweet.create(name: tweet_params[:name], image: tweet_params[:image], text: tweet_params[:text]) end private def tweet_params params.permit(:name, :image, :text) end def move_to_index redirect_to action: :index unless user_signed_in? end end
加えて、user_idに現在ログイン中のユーザーのidを保存する処理を追記する。
問題1:ツイートの保存時に、user_idに現在ログイン中のユーザーのidを保存しましょう
作業ファイル:app/controllers/tweets_controller
ヒント:createの引数の形式に注意して、引数の末尾に保存するカラム名と保存したい値を書き加えてください。
【 問題1の解答を確認する 】
ツイート保存時にユーザー情報も保存できたか確かめる
投稿したユーザーのidをテーブルに保存する処理を記述できたら、実際にそれがうまく機能するか確かめる。
実際にツイートを投稿し、データベースに保存されたレコードを確認する。
user_idに現在ログイン中のユーザーのidが保存されていれば成功である。
要点チェック