#Railsはリレーショナル・データベース(RDB)を使う
リレーショナルデータベースとは、事前定義された、関連があるデータ項目の集合体です。 この項目は、列と行を持つテーブルのセットとして構成されます。
このデータベースの縦列の事を、カラムという
##モデルの作成
$rails generate model User name:string email:string
コントローラ名には複数形を使い、モデル名には単数を使うという慣習がある
(参考)
$rails generate controller Users new
上のコマンドによってマイグレーションファイルが作成されるので、
$rails db:migrate
でマイグレーションの適用を行う
あとからカラムの追加などを行いたいときは、
rails generate migration add_カラム名_to_テーブル名(複数) データ型の指定
#有効性の検証
モデルファイル内でvalidatesメソッドを記述する。
validatesメソッドは、第1引数に対象となるカラム、第2引数以降にオプションを取る。
##存在性の検証
class User < ApplicationRecord
validates :name, presence: true
end
オプションをpresence: true
とすることで、存在性を検証できる
##長さの検証
length: { (maximum or minimum): 長さ}
で長さを検証できる
##フォーマットの検証
オプションをformat: { with: /<regular expression>/ }
とすることで、フォーマットを検証できる
正規表現を利用する。
##一意性の検証
オプションをuniqueness: true
とすることで、検証できる。
さらに、:uniqueness
のオプションとして :case_sensitive
を設定することで、大文字と小文字の区別をなくすことができる。
case_sensitive: true
で大文字小文字の区別をする
##データベースのインデックスの生成
検索の高速化のために、データベースのカラムにインデックス(索引)をつける事ができる。
マイグレーションファイルに
add_index モデル名, カラム名, オプション
(例)add_index :users, :email, unique: true
#Active Recordのコールバック
Railsアプリケーションを普通に操作すると、その内部でオブジェクトが作成されたり、更新されたりdestroyされたりします。Active Recordはこのオブジェクトライフサイクルへのフックを提供しており、これを用いてアプリケーションやデータを制御できます。
コールバックは、オブジェクトの状態が切り替わる「前」または「後」にロジックをトリガします。
コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。
(例)before_save { self.email = email.downcase }
上はコールバックにブロックを渡している。他の方法として、
before_save :(メソッド名)
としておいて、メソッドを他で定義しておく事もできる。
#セキュアなパスワード
パスワードの安全性を保つために、
ユーザーによって入力されたパスワードはハッシュ化してデータベースに保存される。
ユーザーの認証を行う際には、パスワードの送信→パスのハッシュ化→先にデータベースに保存されているハッシュ化されたパスワードの値との比較 という流れ。
##セキュアなパスワードの実装
モデルに has_secure_password というメソッドを追加する。
・セキュアにハッシュ化したパスワードを、データベース内のpassword_digestという属性に保存できるようになる。
・2つのペアの仮想的な属性 (passwordとpassword_confirmation) が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される18 。
・authenticateメソッドが使えるようになる (引数の文字列がパスワードと一致するとUserオブジェクトを、間違っているとfalseを返すメソッド) 。
has_secure_passwordメソッドを使うための条件は、
データベースにpassword_digest属性を追加すること。よって、
$rails generate migration add_password_digest_to_users password_digest:string
また最先端のハッシュ関数を使うためにGemfileにbcrypt gemを追加する。
あとは、モデル内にhas_secure_passwordと記述するだけ