U-Yuri’s 健忘録

U-Yuri’s 備忘録

プログラミングを勉強しています。アウトプットに活用しているブログです。

②Railsで作ったメモアプリにログイン機能を実装【devise】【Userごと】

前回の続き。 ログインするとみんな同じメモをシェアできてしまう問題。Userごとに表示できるメモアプリに変更したい。
今の状態はみんなとメモをシェアできてしまうため、ログインの意味がない状態。

  1. まず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のGithubgithub.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.rbbelongs_toを宣言する。
class MyMemo < ApplicationRecord
    belongs_to :user
end

▼参考

https://railsguides.jp/association_basics.html