Edited at

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

More than 1 year has passed since last update.


メモ


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 を使って、バリデーションを回避しつつ修正するしかない