我一直在寻找一种方式,让用户无需更改他们的密码,更改其设置(用户模式)(他们仍然要输入自己当前的密码)。 设计开箱似乎允许这样做,但是当你删除可验证的模块和设置自定义的验证,看来你需要解决一下。
我已经安装在我的用户模型以下验证:
validates :password, length: { in: 6..128 }
报名时,用户需要指定他的密码(这是我期望的那样)。 当更新设置,不过,如果我离开密码留空它提出了一个错误,说密码必须至少6个字符的用户。
我怎样才能解决这个无需更改设计的工作方式或有实现某种形式的定制控制器?
也许这看起来明显一些,但我花了一段时间让这一起。 尝试不同的解决方案和变通方法,并期待所有的地方了几个小时后,我在Rails的验证更深的鸽子,发现了几个结构,当放在一起,使这很容易。
我所要做的就是设置为创建行动,一个用于更新操作验证,并允许在更新空白。
validates :password, length: { in: 6..128 }, on: :create
validates :password, length: { in: 6..128 }, on: :update, allow_blank: true
就这样,我得到我想要的行为,它是仅有的两个代码短线。
附加说明:
起初,我曾试图这样说:
validates :password, length: { in: 6..128 }, on: :create
这是错误的,因为它会完全跳过更新的验证。 然后,用户将能够设定长/短(或空白?)密码更新设置时。
我试图阿迈勒·库马尔液,但遗憾的是它并没有帮助我解决同样的问题,所以这里被修改的实际项目测试的解决方案版本。
下面是从色器件/模型/ validatable.rb模块的代码
protected
# Checks whether a password is needed or not. For validations only.
# Passwords are always required if it's a new record, or if the password
# or confirmation are being set somewhere.
def password_required?
!persisted? || !password.nil? || !password_confirmation.nil?
end
当你离开空密码和确认密码字段,同时更新用户信息,因为这种情况始终为false验证失败:
!password.nil? || !password_confirmation.nil?
密码和password_confirmation字段等于空字符串“”,这是永远不会等于为零。 所以,你可以解决这个问题通过重写password_required? 方法在用户模式,改变零? 检查空白? 校验。
protected
def password_required?
!persisted? || !password.blank? || !password_confirmation.blank?
end
认为这是要解决这个问题最简单的方法,它是不会破坏原来的逻辑。 也许我们来设计的bug。
此代码添加到您的用户模型。
private
def password_required?
new_record? ? super : false
end
制定有自己的方法来实现这一目标, update_without_password
,它更新记录的属性,而不要求的当前密码。 决不允许改变当前密码。
注意。 如果您正在使用这个方法,你应该重写此方法来保护你不会喜欢没有密码被更新其他属性。
例:
def update_without_password(params={})
params.delete(:email)
super(params)
end
这是所有的设计文档。 http://rdoc.info/gems/devise/index