RailsTutorial6章
db:migrateエラー
sandboxを終了しないとdb:migrateが失敗する
rails aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::BusyException: database is locked
メールアドレスについて
メールアドレスの一意性を保証するためには、もう1つやらなければならないことがあります。 それは、いくつかのデータベースのアダプタが、常に大文字小文字を区別するインデックス を使っているとは限らない問題への対処です。 例えば、Foo@ExAMPle.Comとfoo@example.comが別々の文字列だと解釈してしまうデータベースがありますが、私達のアプリケーションではこれらの文字列は同一であると解釈されるべきです。 この問題を避けるために、今回は「データベースに保存される直前にすべての文字列を小文字に変換する」という対策を採ります。例えば"Foo@ExAMPle.CoM"という文字列が渡されたら、 保存する直前に"foo@example.com"に変換してしまいます。これを実装するためにActive Recordのコールバック(callback)メソッドを利用します。このメソッドは、ある特定の時点で呼び出されるメソッドです。
before_save { self.email = email.downcase } before_save { email.downcase! }
ハッシュ化されたパスワード
has_secure_password
セキュアにハッシュ化したパスワードを、データベース内の
password_digest
という属性に保存できるようになる。 2つのペアの仮想的な属性(password
とpassword_confirmation
)が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される19 。authenticate
メソッドが使えるようになる(引数の文字列がパスワードと一致するとUserオブジェクトを、間違っているとfalseを返すメソッド)。この魔術的なhas_secure_password機能を使えるようにするには、1つだけ条件があります。それは、モデル内にpassword_digestという属性が含まれていることです。
以下を手動で行う必要あり
$ rails generate migration add_password_digest_to_users password_digest:string $ rails db:migrate
has_secure_password
を使ってパスワードをハッシュ化するためには、最先端のハッシュ関数であるbcrypt
が必要