Closed Komei22 closed 7 years ago
user = User.find_by(email: "mhartl@example.com") User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "mhartl@example.com"], ["LIMIT", 1]] => #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com", created_at: "2017-06-28 09:33:06", updated_at: "2017-06-28 09:33:06", password_digest: "$2a$10$XNS7gJ/C5P4azt2DlcxJ6ewiOcLD/RpSzmuAdHl.UjL...">
saveメソッドは全ての情報を保存しようとするので、パスワードも保存しようとしてエラーとなる
irb(main):003:0> user.name = "aaaaaaaaa" => "aaaaaaaaa" irb(main):004:0> user.name => "aaaaaaaaa" irb(main):005:0> user.save (0.1ms) begin transaction User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ? [["email", "mhartl@example.com"], ["id", 1], ["LIMIT", 1]] (0.2ms) rollback transaction => false
これはnameだけを更新するのでエラーにならない
irb(main):008:0> user.update_attribute(:name, "aaaaaaaaaa") (0.1ms) begin transaction SQL (0.5ms) UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = ? [["name", "aaaaaaaaaa"], ["updated_at", "2017-06-28 09:59:17.913877"], ["id", 1]] (2.6ms) commit transaction => true
演習1
コンソールを一度再起動して (userオブジェクトを消去して)、このセクションで作ったuserオブジェクトを検索してみてください。
演習2
オブジェクトが検索できたら、名前を新しい文字列に置き換え、saveメソッドで更新してみてください。うまくいきませんね...、なぜうまくいかなかったのでしょうか?
saveメソッドは全ての情報を保存しようとするので、パスワードも保存しようとしてエラーとなる
演習3
今度は6.1.5で紹介したテクニックを使って、userの名前を更新してみてください。
これはnameだけを更新するのでエラーにならない