見出し画像

TECHCAMP学習26日目


「ユーザー登録をしよう」

ユーザー関連機能はGemを使用する。

目的
deviseを理解すること
Deviseを使用したユーザー登録を理解すること

手順
①Gemをインストールしてサーバーを再起動。
②コマンドを利用してdevise設定ファイルを作成。
③コマンドを利用してUserモデルを作成。
④未ログイン時とログイン時でボタン表示を変える実装。
⑤コントローラーにリダイレクトを設定。

①Gem(devise)をインストール
devise ユーザー管理機能を簡単に実装するGem
インストール後はローカルサーバーを再起動
rails s 後に control+c

②deviseの設定ファイルを作成
Deviseを使用するためには、Gemのインストール+devise専用コマンドで設定ファイルを作成する必要あり。
rails g devise:install コマンド Gemに使用する設定ファイルを自動で生成。

③deviseのUserモデルを作成
deviseモデル作成用コマンドで作成。
rails g deviseコマンド deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理

マイグレーション(テーブルの仕様書)を実行 rails db:migrate

Sequel Proでテーブルを確認。
ここでhttp://localhost:3000にアクセスするが、エラーが出た。サーバーを起動していないことに気づき、rails sを実行した。

④ログインの有無で表示を変えよう
application.html.erbで未ログイン時とログイン時でボタンの表示を変える実装をする。

user_signed_in?メソッド
ログイン状態の確認に使用
ユーザーがログイン状態であればtrueを、ログアウト状態であればfalseを返す。

link_toはデフォルトでGETメソッドを使用
DELETEメソッドを使用する際はmethodオプションで:deleteの指定 GETメソッドはmethodオプションを省略

⑤リダイレクト redirect_to
本来受け取ったパスとは別のパスへ転送する
未ログインユーザーが投稿画面など直接アクセスしてきた場合の対策として、ルートパスに遷移するように設定する。
未ログインユーザー判別にはuser_signed_in?とunlessを使う。

unless
ifはtrueのときにelseまで処理
unlessはfalseのときにelseまで処理

Exceptオプション before_actionで使用できるオプション。この後に指定したアクションに対して、事前に処理は実行されない。

rails g devise:views
deviseのビューファイルを作成
現状はGem内のビューファイルを読み込んでいるだけ

●Usersテーブルにカラム(ニックネーム nickname)を追加

rails g migration (マイグレーション生成コマンド)
rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型

単語の区切り方
スネークケース 単語の区切りをアンダースコア
キャメルケース 先頭が小文字で単語の区切りを大文字
アッパーキャメルケース 先頭も大文字

※クラス名:アッパーキャメルケース
※メソッド名、変数名:スネークケース

maxlengthオプション 入力できる最大文字数

devise_parameter_sanitizerメソッド
deviceにおけるparamsのようなメソッド
ログイン、新規登録などのリクエストからパラメーターを取得できる

deviseにストロングパラメーターを設定するときは特別な記述が必要

「マイページを実装しよう」

ユーザーのマイページ機能
showアクションを使用して実装する。

目的
アソシエーションを理解する
N+1問題の対策を理解する

●ツイートにユーザー情報を追加
tweetsテーブルに user_idカラムをinteger型で追加

・マイグレーション
rails g migration AddUserId(カラム名)ToTweets(追加先テーブル名) user_id(追加するカラム名):integer(型)
※integer カラムの型 数値

rails db:migrate マイグレート

・ツイート保存時にユーザー情報も追加
ツイートを投稿したユーザーのid→現在ログインしているユーザーのid→current_userのid
ツイートを保存する際、name、text、image以外にuser_idカラムにログイン中のユーザーidを保存する

current_usersメソッド
現在ログインしているユーザーの情報を取得できる。

mergeメソッド
ハッシュを結合させるときに使用するRubyのメソッド
今回tweetの情報とuse_idのハッシュを統合。

ブラウザを実行するとエラーが出た。
rails db:migrate:statusで確認したところ、なぜか1つdownがあったので、マイグレーションファイルを加工して解決した。

・アソシエーション
モデルを利用したテーブル同士の関連付けのこと。
TweetモデルとUserモデルの関連付け。

・has_manyメソッド has_many :tweets
Userモデルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態

・belongs_toメソッド belongs_to :user
1つの投稿を複数人が投稿できないため、投稿は必ず1人のユーザーに所属

・マイページの作成 ユーザーの投稿のみが表示される
usersコントローラーのshowアクションを動かせるようにルーティングを設定

・ユーザーに関するshowアクションをコントローラーに定義
rails g controller users
users_controller.rbを編集
必要な情報は「ニックネーム」と「ログイン中のユーザーのツイート投稿」の2つ

・マイページのビューを作成
app/views/usersにファイル作成

●ツイートからユーザー情報も先に読み込む

・N+1問題
アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題

・includesメソッド
N+1問題を解決する
モデル名.includes(:紐付くモデル名)
引数に指定された関連モデルを1度のアクセスでまとめて取得
allメソッドは省略可能

・投稿のNicknameは不要
新規投稿と編集のNickname行を消す。

Tweetsテーブルからnameカラムを削除


この記事が気に入ったらサポートをしてみませんか?