Komei22 / rails-tutorial

rails-tutorialのsample_app作っていきます
0 stars 0 forks source link

ch6.3.4演習 #35

Closed Komei22 closed 7 years ago

Komei22 commented 7 years ago

演習1

コンソールを一度再起動して (userオブジェクトを消去して)、このセクションで作ったuserオブジェクトを検索してみてください。

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...">

演習2

オブジェクトが検索できたら、名前を新しい文字列に置き換え、saveメソッドで更新してみてください。うまくいきませんね...、なぜうまくいかなかったのでしょうか?

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

演習3

今度は6.1.5で紹介したテクニックを使って、userの名前を更新してみてください。

これは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