Rails使用Devise编辑已有用户时提示密码不能为空错误如何解决
问题根源
你的User模型中自定义的密码存在性验证没有限定触发场景,是导致报错的核心原因:
- 你写的
validates :email, :password, presence: true没有加on参数,默认在创建和更新用户记录时都会触发校验。 - 从数据库中查询得到的User实例不会携带明文密码,你修改
user_type后执行保存时,实例的password字段为空,直接触发了存在性校验报错。 - 额外说明:你引入的Devise
:validatable模块已经内置了邮箱、密码的存在性校验逻辑,且默认支持「更新用户属性时不填密码就不校验密码」的规则,你额外添加的全局存在性验证覆盖了Devise的默认逻辑。
修复方案
永久修复(推荐)
二选一即可:
- 直接删除你自定义的
validates :email, :password, presence: true行,完全使用Devise自带的验证规则即可,你原本写的validates :password, length: {in: 5..15}, on: :create可以保留,用来限制创建用户时的密码长度。 - 如果你需要保留自定义的存在性校验,给该行加上创建场景限制,修改为:
validates :email, :password, presence: true, on: :create
临时绕过(仅用于本次快速修改用户身份)
如果需要立刻把现有用户改成管理员,不需要改代码的前提下,可以用update_column方法跳过验证直接修改数据库字段:
development environment > user = User.first development environment > user.update_column(:user_type, "admin")
内容的提问来源于stack exchange,提问作者Oleksandr Novik
相关产品推荐
相关产品推荐

