Railsチュートリアル

Rails チュートリアル メモ 第6章

メモ

6.1.1

  • モデル名は単数形、コントローラーとテーブル名は複数形

6.1.3

  • rails console --sandbox でサンドボックスモードに突入可能
  • モデルクラスの create メソッド = new + save
    • destroy メソッドで DB から削除できるが、メモリには残っている

6.1.4

  • find : DB 上の ID で検索
  • find_by : ハッシュを与えてそれで検索
    • find_by_name のようなメソッドも生えている(こっちが新しい?)

6.1.5

  • reload : DB から読み込み直す
  • update_attributes :

6.2.2

  • バリデーションルールはモデルクラスに書く
  • バリデーションで失敗すると、そのオブジェクトの .errors 属性が埋まる
    • user.errors.full_messages などとして情報が取得できる

6.2.5

  • モデルに uniqueness : true を指定すると、valid? メソッド実行時に DB が SELECT される
    • 既に存在してないかを確認するため
    • 逆に言うと、valid? を実行するまでは errors を取得しても何も出てこない

6.2.5

  • 出てきた4つのバリデーションのうち、presenceuniqueness は DB レベルでも保証したほうがよさそう
    • length は DB 側の型によって決まる
    • format は DB 側で検証できなさそう?

6.2.5

  • マイグレーションの名前は、コミットログのように「何をやったか」がわかるように書くこと
    • 例: rails generate migration add_index_to_users_email
# そうするといい感じになる

ls -1 db/migrate/
20180611072246_create_users.rb
20180614054521_add_index_to_users_email.rb
  • あとでわかったが、末尾を to_テーブル名 として、引数で カラム名:型 を渡すと、いきなりいい感じのマイグレーションを作ってくれる
    • 例: rails generate migration add_password_digest_to_users password_digest:string

6.2.5

  • before_save で保存時に何か処理した結果をテストする場合、reload が便利

6.3.1

  • モデルクラスに has_secure_password なるメソッドを書くだけで、以下のようなことが起きる
    • DB の password_digest カラムに、ハッシュ化されたパスワードを保存できるようになる
    • 以下の属性が生える
      • password : ユーザーが入力したパスワード
      • password_confirmation : 確認用に2回入力してもらった方のパスワード
      • いずれも、存在性とパスワード一致のバリデーション付き
    • 以下のメソッドが生える
      • authenticate
  • 条件
    • password_digest というカラムが DB に存在すること
    • bcrypt gem のインストール

6.3.3

  • 前述の通り password にはデフォルトで存在性のバリデーションがかかっているが、これは新規追加のときにしか働かないので、そのままだと全てスペースのパスワードに変更できてしまう
    • これを防ぎたかったら、自分で presence バリデーションを書くしかない
    • これを防ぐ必要あるのかな?全て「a」のパスワードを特に防がないのと同じ理由で、放っておいてもいい気もするけど
  • なんにせよ、password のバリデーションを開いて修正するときは注意が必要そう

6.3.4

  • DB からユーザーを検索 → 名前だけ変更 → 保存しようとすると、エラーになる
  • これは、password 属性が埋まっていないから
    • DB には password_digest カラムしか存在せず、そこから元のパスワードは復元できない
    • update_attribute を使って、バリデーションを回避しつつ修正するしかない