【发布时间】:2015-05-22 13:02:08
【问题描述】:
我在阅读 Ruby On Rails 教程时遇到了这些问题 here
User 类的验证是:
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 }
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }, allow_blank: true
.
.
.
end
在测试中,同时将更新的用户信息修补到用户的路由中,如下所示:
def setup
@user = users(:michael)
end
.
.
.
test "successful edit" do
get edit_user_path(@user)
assert_template 'users/edit'
name = "Foo Bar"
email = "foo@bar.com"
patch user_path(@user), user: { name: name,
email: email,
password: "",
password_confirmation: "" }
assert_not flash.empty?
assert_redirected_to @user
@user.reload
assert_equal name, @user.name
email, @user.email
end
测试会通过,只有用户名和电子邮件会被更新,密码不会改变。
如果密码验证不包含“allow_blank:true”,则此测试将失败。
所以我不明白:当测试通过意味着密码可以为空时,为什么它不会将密码更改为空白? Rails 怎么会知道我只是想更新一些属性?
【问题讨论】:
-
小心,
has_secure_password已经定义了验证 api.rubyonrails.org/classes/ActiveModel/SecurePassword/… -
@apneadiving 那么allow_blank有什么用呢?
标签: ruby-on-rails ruby validation patch updatemodel