Rails“update_attributes”跳过验证?

时间:2012-12-19 02:43:42

标签: ruby-on-rails rspec

我有以下简化模型:

class User
  attr_accessible :password
  validates :password, :presence => true
  validates_confirmation_of :password, :length => { :minimum => 4 }
end

这很直截了当。我正在用RSpec / FactoryGirl进行测试,并进行了以下测试:

it "cannot create with password < 4 characters" do
  expect{ model = FactoryGirl.create(:user, :password => "12", :password_confirmation => "12") }.to raise_error
end

it "cannot update to password < 4 characters" do
  model = FactoryGirl.create(:user)
  model.should be_valid
  model.update_attributes({:password => "12", :password_confirmation => "12"})
  model.reload
  model.password.should_not eq("12")
end

但是,第二次测试失败了。出于某种原因,“12”似乎可以作为有效密码保存到数据库中。为什么? API声明update_attributes不应绕过任何验证!

1 个答案:

答案 0 :(得分:3)

我认为它不会跳过验证。

我怀疑这个:

model.update_attributes({:password => "12", :password_confirmation => "12"})

返回false。密码可能不是数据库中的一列,而是你可能有crypted_pa​​ssword和password_salt,所以重新加载它不会从数据库中读取密码(这会很糟糕)

另外,您可能想要:

attr_accessible :password, :password_confirmation