Rails 模型:before_save {self.password = password.strip} 与 before_save {password.strip!}
Rails model: before_save {self.password = password.strip} vs. before_save {password.strip!}
我的用户模型中有几行要从用户的电子邮件和密码中删除 leading/tailing white-space。原始代码如下所示:
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: " foo@bar.com",
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.strip!
因为实际上没有 password
这样的字段 - 它是一个 setter password=
生成和存储密码哈希。
我的用户模型中有几行要从用户的电子邮件和密码中删除 leading/tailing white-space。原始代码如下所示:
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: " foo@bar.com",
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.strip!
因为实际上没有 password
这样的字段 - 它是一个 setter password=
生成和存储密码哈希。