루비온 레일스 터토리얼 6장

12284 단어 RubyRails
6.1.1
연습하다
Rails는db/디렉토리의 schema입니다.rb라는 파일을 사용합니다.이것은 데이터베이스 구조를 추적하는 데 쓰인다.그럼, 당신의 환경에서의db/schema.rb의 내용을 조사하고 그 내용과 이전 파일(목록 6.2)의 내용을 비교하십시오.
거의 모든 이전은 취소할 수 있다. (적어도 이 강좌에서는 모든 이전을 취소할 수 있다.)복구 원형을 '롤백 (rollback)' 이라고 하는데, Rails에서db: 롤백 명령을 사용할 수 있습니다.
$ rails db:rollback
상기 명령을 실행하면db/schema.rb의 내용을 조사하여 스크롤이 성공했는지 확인하십시오(칼럼 3.1에서도 이전과 관련된 다른 기교를 총결하였으니 참고하십시오).위의 명령에서drop-데이터베이스에서users표를 삭제합니다내부에서 테이블 명령을 호출합니다.이게 잘 되는 게 드롭이에요.table 및 createchange 방법은 테이블이 각자 대응하는 것을 알고 있기 때문이다.이 대응 관계를 알고 있기 때문에 스크롤용 역이동을 간단하게 실현할 수 있다.또한 어떤 열을 삭제할 때 역이동할 수 없는 경우, change 방법 대신 up과down을 각각 정의해야 한다.자세한 내용은 Rails 가이드의 Active Record 마이그레이션을 참조하십시오.
railsdb:migrate 명령,db/schema를 다시 실행합니다.rb의 내용이 원상태로 돌아왔는지 확인해 주세요.
1
그 다음의
db/development.sqlite3

Users 테이블의 id name
Email
Created_at
Updateed_약속이 있다
실패하자마자 사라지다
연습하다
1. Rails 콘솔, User를 엽니다.new에서 User 클래스가 생성되었는지 확인하고 Application Record가 상속되었는지 확인하십시오(팁: 4.4에서 설명한 기술을 사용하십시오).
2. Application Record가 Active Record:Base를 상속했는지 확인하십시오.
소스 붙여넣기https://railstutorial.jp/chapters/modeling_users?version=5.1#code-users_migration

>> User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> User.superclass
=> ApplicationRecord(abstract)

>> ApplicationRecord.superclass
=> ActiveRecord::Base

연습하다
1. user.name 및 user 입니다.이메일이 모두 String 레벨의 인스턴스인지 확인하십시오.
2. created_at 및 업데이트그렇다면 어떤 종류의 실례가 있을까?

>> user.name.class
=> String
>> user.email.class
=> String
>> user.created_at.class
=> ActiveSupport::TimeWithZone
>> user.updated_at.class
=> ActiveSupport::TimeWithZone

연습하다
1. name을 사용하여 사용자 객체를 검색합니다.또한,findby_name 방법을 사용할 수 있는지 확인하십시오. (오래된 Rails 프로그램에서 오래된 종류의find by를 자주 볼 수 있습니다.)
2. 실용적인 목적을 위해 User.all는 수조처럼 처리할 수 있지만 실제로는 수조가 아니다.User.Aray 클래스가 아닌 User:ActiveRecord-에서 생성된 객체 조사Relation 클래스인지 확인하십시오.
3. User.all에 length 방법을 호출하면 길이(4.2.3)를 확인하십시오.루비의 성격으로는 그 반을 자세히 알지 않아도 대상자를 어떻게 처리해야 할지 모르는 성격이 있다.오리고기라고 불리며'오리처럼 생겨서 오리처럼 짖으면 오리죠'라는 격언을 자주 쓴다.(역문주: 이렇게 말하면 루비케이지 2016의 기조강연에서 루비작가 마츠가 오리구이 타자에 대해 설명하였다. 이것은 간단명료하고 알기 쉬운 설명이니 꼭 한번 보십시오.

>> User.find_by(name: "Michael Hartl")
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."name" = ? LIMIT ?  [["name", "Michael Hartl"], ["LIMIT", 1]]
=> #<User id: 1, name: "Michael Hartl", email: "[email protected]", created_at: "2019-04-10 04:56:30", updated_at: "2019-04-10 04:56:30">
>> User.find_by_name("Michael Hartl")
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."name" = ? LIMIT ?  [["name", "Michael Hartl"], ["LIMIT", 1]]
=> #<User id: 1, name: "Michael Hartl", email: "[email protected]", created_at: "2019-04-10 04:56:30", updated_at: "2019-04-10 04:56:30">
>> User.all.class
=> User::ActiveRecord_Relation

>> User.all.length                                                           
  User Load (0.2ms)  SELECT "users".* FROM "users"
=> 2

연습하다
1. 사용자 대상에 대입된name 속성을 사용하여 업데이트하고save로 저장하십시오.
2.이번엔 업데이트attributes를 사용하여 이메일 속성을 업데이트하고 저장하십시오.
3. 마찬가지로 마술열의createat도 직접 업데이트할 수 있는지 확인하세요.팁: 업데이트할 때'1.year.age'를 사용하는 것이 비교적 편리하다.이것은 Rails 흐름의 시간 지정 중 하나로 현재 시간부터 1년 전의 시간을 계산한다.

>> user.name = "Michael"
=> "Michael"
>> user.save
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.1ms)  UPDATE "users" SET "updated_at" = ?, "name" = ? WHERE "users"."id" = ?  [["updated_at", "2019-04-10 07:28:42.828990"], ["name", "Michael"], ["id", 1]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true
>> user.update_attribute(:email, "[email protected]")                       
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.5ms)  UPDATE "users" SET "email" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["email", "[email protected]"], ["updated_at", "2019-04-10 07:29:23.519503"], ["id", 1]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true
>> user.update_attribute(:created_at, 1.year.ago)
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.1ms)  UPDATE "users" SET "created_at" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["created_at", "2018-04-10 07:30:17.177732"], ["updated_at", "2019-04-10 07:30:17.178432"], ["id", 1]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true

연습하다
1. 콘솔에서 새로 생성된user 대상이 유효한지 확인(valid).
2. 6.1.3에서 생성된user 대상이 유효한지 확인합니다.
>> @user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> @user.valid?
=> true
2:以前生成したuserオブジェクトも有効かどうか検証

>> User.find(1).valid?
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> true
>> User.find(2).valid?
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
=> true

연습하다
1. 너무 긴name과 이메일 속성을 가진user 대상을 생성하여 무효를 확인합니다.
2. 길이 검증에 실패하면 어떤 오류 메시지가 발생할까요?확인해 보세요.
>> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> user.name = "a" *51
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>> user.email = "a" * 244 + "@example.com"
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com"
>> user.valid?
=> false

>> user.errors.full_messages
=> ["Name is too long (maximum is 50 characters)", "Email is too long (maximum is 255 characters)"]
>> 

연습하다
1. 목록 6.18의 유효 메일 주소 목록과 목록 6.19의 유효하지 않은 메일 주소 목록을 Rublar의 Your test string에 기록합니다.그리고 목록 6.21의 정규 표현식을 Your reglar expression에 기록합니다. 유효한 메일 주소만 일치하고 잘못된 메일 주소는 일치하지 않는지 확인하십시오.
2. 아까 언급한 바와 같이 목록 6.21의 메일 주소를 검사하는 정규 표현식은 [email protected]처럼 연속적으로 무효한 메일 주소를 허용한다.우선, 이 메일 주소를 목록 6.19의 무효한 메일 주소 목록에 추가하여 테스트에 실패했는지 확인하십시오.그리고 목록 6.23에서 보여준 약간 복잡한 정규 표현식을 사용하여 이 테스트가 통과되었는지 확인하십시오.
3. [email protected]를 Rublar의 메일 주소 목록에 추가하고 Rublar에서 목록 6.23의 정규 표현식을 사용합니다.올바른 e-메일 주소만 일치하고 잘못된 e-메일 주소는 일치하지 않는지 확인합니다.
목록 6.23: 연속 2개

테스트 확인
VALID_EMAIL_REGEX =/\A[\w+-.]+@[a-z\d-]+(.[a-z\d-]+)*.[a-z]+\z/i
테스트 통과 구현 >

[email protected]
유효한 일치
연습하다
1. 목록 6.33을 참고하여 메일 주소를 소문자로 설정한 테스트를 목록 6.32에 추가합니다.참고로 추가 테스트 코드에서 데이터베이스 값에 따라 업데이트된reload 방법과 값이 일치하는지 확인하는 assertequal 방법을 사용합니다.목록 6.33의 테스트가 순조롭게 실행되었는지 확인하기 위해 선택하십시오세이브의 줄이 리뷰에서 레드로 변하는 것을 확인하고, 리뷰 출력을 해제하면 그린으로 변한다.
2. 테스트 세트의 실행 결과를 확인하는 동시에beforesave 호출 이메일.downcase!고쳐 써 보아라.팁: 방법의 끝!이메일 속성을 직접 수정할 수 있습니다(목록 6.34).
before_save 줄 설명 중 오류 확인

ec2-user:~/environment/sample_app (modeling-users) $ rails t
Running via Spring preloader in process 10629
Started with run options --seed 23577

 FAIL["test_email_addresses_should_be_saved_as_lower-case", UserTest, 0.3943505509996612]
 test_email_addresses_should_be_saved_as_lower-case#UserTest (0.39s)
        Expected: "[email protected]"
          Actual: "[email protected]"
        test/models/user_test.rb:48:in `block in <class:UserTest>'

  14/14: [==============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.43841s
14 tests, 29 assertions, 1 failures, 0 errors, 0 skips
2
before_save { self.email = email.downcase! }を
before_save { email.downcase! }

설사 말을 바꾸어도 시험은 통과했다
연습하다
1. 이때user 대상에게 유효한 이름과 메일 주소를 주어도valid 인코더 63?실패 여부를 확인하십시오.
2.왜 실패했을까?오류 메시지를 확인하십시오.
6.3.3 비밀번호의

>> user = User.new(name: "yamada",email: "[email protected]")            
=> #<User id: nil, name: "yamada", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: nil>

>> user.valid?
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) LIMIT ?  [["email", "[email protected]"], ["LIMIT", 1]]
=> false

연습하다
1. 유효한 이름과 메일 주소라도 비밀번호가 너무 짧아서user 대상을 사용할 수 없음을 확인합니다.
2.위에 실패할 때 어떤 오류 메시지가 있을까요?확인해봐.

>> user= User.new(name:"yamada",email:"[email protected]",password:"1234")
=> #<User id: nil, name: "yamada", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$XzOGHWI26ChNNC0sUU6A0.yGZFaoFf3g0OcJxmeGVdQ...">
>> user.valid?
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) LIMIT ?  [["email", "[email protected]"], ["LIMIT", 1]]
=> false
>> user.errors.full_messages
=> ["Password is too short (minimum is 6 characters)"]

사용자 생성 확인

연습하다
1. 컨트롤러를 다시 시작하고(user 대상 삭제) 이 영역의user 대상을 찾으십시오.
2. 대상을 검색할 수 있으면save 방법으로 이름을 새 문자열로 바꾸고 업데이트하십시오.잘 안 되고 있어요.왜 안 풀리지?
3. 다음에는 6.1.5에서 소개한 기교를 사용하여user의 이름을 업데이트하십시오.

>> user = User.find_by(email: "[email protected]")
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "[email protected]"], ["LIMIT", 1]]
=> #<User id: 1, name: "Michael Hartl", email: "[email protected]", created_at: "2019-04-11 07:54:02", updated_at: "2019-04-11 07:54:02", password_digest: "$2a$10$hO4Ic/m6emGj03egTvc/5.b1zZgS/Gzff3S7MH9srwr...">
>> user.name="newyamada"
=> "newyamada"
>> 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", "[email protected]"], ["id", 1], ["LIMIT", 1]]
   (0.1ms)  rollback transaction
=> false
>> user.update_attribute(:name, "El Duderino")
   (0.1ms)  begin transaction
  SQL (1.9ms)  UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["name", "El Duderino"], ["updated_at", "2019-04-11 08:43:38.448201"], ["id", 1]]
   (5.5ms)  commit transaction
=> true




좋은 웹페이지 즐겨찾기