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つのペアの仮想的な属性(passwordpassword_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が必要