У меня есть несколько строк в моей модели 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!}
Это прекрасно работает мой электронный тест, но он сломал тест пароля выше. Итак, вопрос в том, как исходная версия действительно отличается от переупорядоченного кода?
Я думаю, что понял. Поэтому, хотя есть метод чтения для @password, код, в котором пароль получает хэширование, встречается только в методе setter. Поэтому он позволяет мне называть self.password.strip !, но он не передает результат хеш-функции. Он изменяет переменную экземпляра, но изменение не попадает в базу данных. Первоначальная версия работала, потому что вместо этого использует метод setter. Правильно ли это звучит? – Mike
@Mike да, вся магия в сеттере – Vasfed