2016-04-06 14 views
0

Kullanıcı modelimde Kullanıcı e-postasından ve şifresinden önde gelen/çok büyük bir boşluk bırakmak için birkaç satırım var. Orijinal kod aşağıdaki gibi görünüyordu: Rails model: before_save {self.password = password.strip} vs. before_save {password.strip!}

test "password entry should ignore leading/tailing whitespace" do 
@user = User.create(name: "M", email: " [email protected]", 
    password: " password", password_confirmation: " password") 
assert @user.authenticate("password") 
assert_not @user.authenticate(" password") 
end 

Şimdi yeniden faktör bunu çalıştı:

before_save {self.email = email.strip} 
before_save {self.password = password.strip} 
before_save {self.password_confirmation = password_confirmation.strip} 

Bu benim testi geçti

before_save {email.strip!} 
before_save {password.strip!} 
before_save {password_confirmation.strip!} 

Bu benim e-posta test için çalışıyor, ama yukarıdaki şifre testi kırıldı. Öyleyse, asıl sürüm aslında yeniden faktörlü koddan nasıl farklıdır?

cevap

0

password.strip!'u kullanamazsınız çünkü aslında password gibi bir alan yoktur - bu, parola karması üreten ve depolayan bir password= dizgindir.

+0

Sanırım anladım. Bu yüzden, @password için bir okuyucu yöntemi varken, şifrenin karışmadığı kod sadece setter yönteminde gerçekleşir. Bu yüzden self.password.strip! 'I çağırmamı sağlar, ancak sonucu karma işlevine aktarmaz. Örnek değişkeni değiştirir, ancak değişiklik veritabanına girmez. Orijinal sürüm işe yaradı, çünkü bunun yerine setter-method kullanıyor. Bu doğru mu? – Mike

+0

@Mike evet, tüm sihir dizide – Vasfed

İlgili konular