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カラムを削除
この記事が気に入ったらサポートをしてみませんか?