2016-04-06 10 views
0

У меня есть несколько строк в моей модели User, чтобы удалить пробелы в верхнем/нижнем пробеле из электронной почты пользователя и пароля. Исходный код выглядит следующим образом:Модель рельсов: before_save {self.password = password.strip} vs. before_save {password.strip!}

before_save {self.email = email.strip} 
before_save {self.password = password.strip} 
before_save {self.password_confirmation = password_confirmation.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 

Теперь я попытался повторно фактор его:

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

Это прекрасно работает мой электронный тест, но он сломал тест пароля выше. Итак, вопрос в том, как исходная версия действительно отличается от переупорядоченного кода?

ответ

0

Вы не можете использовать password.strip!, потому что на самом деле нет такого поля, как password - это сеттер password=, который генерирует и сохраняет хэш пароля.

+0

Я думаю, что понял. Поэтому, хотя есть метод чтения для @password, код, в котором пароль получает хэширование, встречается только в методе setter. Поэтому он позволяет мне называть self.password.strip !, но он не передает результат хеш-функции. Он изменяет переменную экземпляра, но изменение не попадает в базу данных. Первоначальная версия работала, потому что вместо этого использует метод setter. Правильно ли это звучит? – Mike

+0

@Mike да, вся магия в сеттере – Vasfed