2012-03-01 6 views
1

루비 보석 BCrypt에는 모듈 중 하나를 사용하는 방법에 대한 예제가 있습니다. 워드 프로세서에서 촬영 :인스턴스 변수 & self.variable 사용

def password 
    @password ||= Password.new(self.password_hash) 
end 

def password=(new_password) 
    @password = Password.create(new_password) 
    self.password_hash = @password 
end 

왜 우리는 변수 인스턴스를 사용하는 것이 @password 전혀 우리가 self.password_hash 속성이있을 때? 나는 무언가를 놓치고있는 것처럼 느낍니다, 아마도 루비에 대한 나의 미숙함 때문일 것입니다. 개인적으로, 내가 믿는 것을 성취했을 것이와 동일합니다 :

def password 
    self.password_hash ||= Password.new(self.password_hash) 
end 

def password=(new_password) 
    self.password_hash = Password.create(new_password) 
end 
+2

나는 대답하기 시작했다. 그러나 그 다음 깨달았다, 당신이 옳다, 그것은 조금 이상하다. '@ password'와'# password_hash'의 차이점을 알아 내기 위해 주변 상황을 조사해야 할 것 같습니다. 나는 당신의 방법이 효과가있을 것이라고 생각하지만,이 두 가지가 다를 수 있도록 다른 부작용이있을 수 있습니다. 필자가 확실히 말할 수있는 유일한 것은'@ password'는 항상 Password 인스턴스이지만'# password_hash' _가 될 수 있지만 항상 _있는 것처럼 보이지는 않는 것처럼 보입니다. '# password_hash ='를 호출하는 변경 방법이 있습니까? – Matt

답변

2

차이점은 다음과 같습니다 암호 해시는 문자열 - 암호의 해시. 그러나 Password.new(self.password_hash)Password 클래스의 새 개체를 만듭니다. 따라서 차이 : StringPassword. cost, version 등의 메서드를 Password 개체에서 호출 할 수 있으며 String에서는 사용할 수 없습니다. - to_s 방법은 해시를 반환

def password=(new_password) 
    @password = Password.create(new_password) 
    self.password_hash = @password 
end 

하지만이 self.password_hash 할당에 Password 객체 String에 객체의 변환이 분명하지 않은, 여기에서 발생합니다

난 당신이 이상한 다음 방법을 찾을 것 같아요 그 값은 데이터베이스에 저장됩니다. 또한 @password 인스턴스 변수가 설정되어 있으므로 password 메서드는 String 암호가 아닌 Password 클래스의 인스턴스를 반환합니다.

+0

감사합니다. 그 말이 완벽합니다. docs를 다시 보았을 때,'self.password_hash'는 데이터베이스의': string'입니다. +1 –