前回の続き。
ログインするとみんな同じメモをシェアできてしまう問題。Userごとに表示できるメモアプリに変更したい。
今の状態はみんなとメモをシェアできてしまうため、ログインの意味がない状態。
- まずmy_memoテーブルの中に、usersテーブルの中のuserIDが欲しい為、追加。
▼my_memos dbの中身
sqlite> select * from my_memos; id = 3 title = test2 comment = test2 created_at = 2023-09-04 14:25:32.420428 updated_at = 2023-09-04 14:25:32.420428
▼users dbの中身
id = 1 email = ユーザのmail@〇〇.com encrypted_password = パスワードが入っている reset_password_token = reset_password_sent_at = remember_created_at = name = created_at = 2023-09-05 05:09:42.867724 updated_at = 2023-09-05 05:09:42.867724
- カラム追加用のmigrateを作成する。
$ rails generate migration Addカラム名Toテーブル名 カラム名:データ型
$ rails generate migration AddUserIdToMyMemos user_id:integer ※この時テーブル名に_が入っている場合は含めないで記載。大文字にする(_以降も大文字に)
- migrateに作成された
~_add_~.rb
を編集(FKの設定)
class AddUserIdToMyMemos < ActiveRecord::Migration[7.0] add_reference :my_memos, :user, foreign_key: true end ※add_referenceの部分はadd_columnになっていると思うので変更し、2つ目のカラム名もテーブル名に変更する。 ※type: integerはデフォルトでいいので書かなくて良い。 また、IDがNULLになって欲しくない場合は、null: falseをforeign_key: true, の後に追加。テーブルのschemaにnut nullを追加する設定。
$ rails db:migrate
を実行sqlite> .schema my_memos
でIDのカラムが作成できるか確認
sqlite> .schema my_memos CREATE TABLE IF NOT EXISTS "my_memos" ("id" integer NOT NULL PRIMARY KEY, "title" varchar DEFAULT NULL, "comment" text DEFAULT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "user_id" integer DEFAULT NULL, CONSTRAINT "fk_rails_e46eb3e434" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ); CREATE INDEX "index_my_memos_on_user_id" ON "my_memos" ("user_id");
- dbの中を確認してみる。
id = 16 title = test2 comment = w created_at = 2023-09-06 03:26:12.333004 updated_at = 2023-09-06 03:26:12.333004 user_id =
このままだと上記で確認できるようにuser_idは反映されないのでcookieがセットされる際に生成されるトークンが分かればuser_idを取れるのではないか。
deviseのGithub▼
github.com
この部分のcurrent_user
が使えそう!current_user.id
でuser_idが取れた。
- add/controllers/my_memos_controller.rb
の中のdef create
内を書き換える。
def create user_memo = my_memo_params #my_memo_paramsはメソッドなので毎回呼び出されるごとに新しくハッシュが形成されるので、変数に入れる。 user_memo[:user_id] = current_user.id #ハッシュの中にuser_idを追加する @my_memo = MyMemo.new(user_memo) #引数は作成した変数に変更 if @my_memo.save redirect_to my_memos_path else render :new end end
- サーバを立ち上げ、メモを作成しdbの中を確認してみる。
id = 18 title = test更新 comment = qqqqqqqq created_at = 2023-09-06 03:29:10.878928 updated_at = 2023-09-06 03:29:10.878928 user_id = 3
これでuser_idが入っていることが確認できる。
index.html.erb
でログインしているuser_idのメモだけを表示する。
app/controllers/my_memos_controllers.rb
のindexを変更
class MyMemosController < ApplicationController def index @my_memos = MyMemo.where(user_id: current_user.id) end
※active_recordのwhereメソッドを使うとuser_id: current_user.id
:現在ログインしているuser_idのデータのみを取り出すことができる。
▼以下参照
https://railsguides.jp/active_record_basics.html
Active Record クエリインターフェイス - Railsガイド
独習Ruby on Rails P185
- モデル間の関連付けを行う
app/models/my_memo.rb
にbelongs_to
を宣言する。
class MyMemo < ApplicationRecord belongs_to :user end
▼参考