Модель Rails: 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!}

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


person Mike    schedule 06.04.2016    source источник


Ответы (1)


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

person Vasfed    schedule 06.04.2016
comment
Думаю, я понял. Таким образом, хотя для @password существует метод чтения, код, в котором пароль хешируется, встречается только в методе установки. Таким образом, он позволяет мне вызвать self.password.strip!, но не передает результат хеш-функции. Он изменяет переменную экземпляра, но это изменение не попадает в базу данных. Первоначальная версия работала, потому что вместо этого использовала метод установки. Это звучит правильно? - person Mike; 06.04.2016