Railsチュートリアル 第6章
コントローラーには複数形、モデルには単数形を用いる。
6.1.3 ユーザーオブジェクトを作成する
$rails console --sandbox
普通のコンソールだとデータベースへの変更は反映されてしまうが、--sandboxをつけるとconsoleが戻った時にrollbackしてくれるのでデータベースへの変更も安心して行える。
・user.createはuser.newとuser.saveをまとめて行うためのもの。
6.1.5 ユーザーオブジェクトを更新する
user.update_attributes(name:〇〇,email:〇〇)
元々のname,emailから上書きで変更される。ただしupdate_attributesは変更する値の1つでも保存ができないと全ての変更がキャンセルとなる。
単数形だとupdate_attribute、複数形だとupdate_attributesになる
user.valid?
user.valid?を使うとuserがvalidatesに引っかかってないかどうか調べる。引っかかっていない場合はtrue引っかかった場合はfalseを出す。またfalseが出た時にどのvalidatesに引っかかったのかわからない場合
user.errors.full_message
を使うとどこがダメだったのか教えてくれる。
6.2.4 フォーマットを検証する
アドレスのvalidatesで問題の一つがアドレスの形式で登録しないといけないというvalidatesである。正しい形式以外をはじくvalidateは
format:{with:正規表現}
という形でvalidatesを書いていく。そして次に正規表現をどうするのかを決めて実装する。
メールフォーマットの正規表現は
\/A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
となる
※解説はrailsチュートリアルを参照
これをVALID_EMAIL_REGEXに代入して実装する
VALID_EMAIL_REGEX = \/A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
format:{with:VALID_EMAIL_REGEX}
となる
アドレスの一意性
本来アドレスは大文字と小文字の区別がない。しかしプログラミング上ではもちろん違いがあるので同じアドレスであったとしても大文字の部分と小文字の部分の違いによって違うものと判断され、validatesに引っかかってしまう。なのでそれを解消するためのコードを書く。
uniqueness: {case_sensitive: false}
上記を記入すると大文字小文字関係なく同じアドレスとして認証されるようになる。
データベースにインデックスをつける
データベースにインデックスをつけると内容を複製して調べやすい順番で並べ替えてくれる。そのため検索などを使うときにデータベースの上から順番に見るより調べやすいデータベースの順番で検索した方が素早く検索ができる。そのためにつけるのがインデックス(index)というもの。
add_index :users, :email, unique:true
add_index :調べやすくして欲しいテーブル名, :そのテーブルの基準になるカラム名(emailだとアルファベット順に並ぶなど), unique:true
6.3 セキュアなパスワードを追加する
パスワードをそのままテーブルに保存してしまうとセキュリティ面でも誰かに見られたら悪用されてしまう。
このためにパスワードを暗号化して保存できるようにする。
①Userモデルでhas_secure_passwordを呼ぶ
has_secure_passwordを呼ぶことで
・password_digestを利用できるようになる
・passwordとpassword_comfirmationが使えるようになる
・authenticateメソッドが使えるようになる(ログイン時に暗号化したパスワード同士を照らし合わせてログインさせる機能)
②password_digestカラムを作る(userテーブルに)
マイグレーションファイルでテーブルにpassword_digestカラムが入るようにする。
(ファイル名の末尾にto_usersとすることでusersテーブルに入るようになる)
③パスワードを暗号化するためにbcryptをGemfileに追加する
gem 'bcrypt', '3.1.12'
bundle installを行いgemを反映させる
④パスワードのvalidatesを作る
validates :password, presence: true, length: { minimum: 6 }
パスワードのvalidatesを作る(空文字は入れない、文字は最小で6文字というvalidatesになっている)