我正在为使用Authlogic的Rails应用程序添加密码重置功能。我在这里遵循指南:http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/除了一件事之外,一切都按照我的意愿运行:密码重置表单接受空白密码并且不会更改它们。
我一直在搜索,并且已经了解到这是预期的默认行为,因为它允许您创建用户编辑表单,只有在用户输入新密码时才更改用户密码,否则忽略它。但在这种情况下,我特别希望强制验证密码,就像用户最初注册时一样。我已经为这个问题找到了两种可能的解决方案,但是却无法弄清楚如何实现这两种方法。
1)有人在Google网上论坛上提出同样的问题:
User model saves with blank password
Ben的回答是使用@user.validate_password = true
来强制验证密码。我尝试了这个但是我得到了一个未定义的方法错误:undefined method 'validate_password_field=' for #<User>
。
2)似乎有一个名为ignore_blank_passwords
的Authlogic配置选项。这里记录在案:
Module: Authlogic::ActsAsAuthentic::Password::Config#ignore_blank_passwords
这看起来可行,但我的理解是这是一个全局配置选项,您在User模型的初始acts_as_authentic
调用中使用,我不想在应用程序范围内更改它,因为我有一个常规的编辑表单,我希望默认情况下可以忽略空白密码。
有人找到了解决方法吗?我在Authlogic 1.4.1的更改日志中看到validate_password=
,从那时起它就一直没有被删除。我只是错误地使用它吗?有没有办法在每个请求的基础上使用ignore_blank_passwords
?
答案 0 :(得分:8)
这是一个旧线程,但由于没有答案,我会发布这个。
我设法比其他解决方案做得更干净,“帮助”验证我自己的验证。
我将此添加到用户:
class User < ActiveRecord::Base
...
attr_writer :password_required
validates_presence_of :password, :if => :password_required?
def password_required?
@password_required
end
...
end
您可以通过制作attr_accessor
并使用:if => :password_required
(无审讯)将其缩减为两行,但我更喜欢使用询问符号的其他语法。
然后您的控制器操作可以这样完成:
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
@user.password_required = true
if @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
这将产生局部效应;应用程序的其余部分不会受到影响(除非password_required
在其他地方设置为true,即)。
我希望它有所帮助。
答案 1 :(得分:5)
这就是我所做的。
class User < ActiveRecord::Base
attr_accessor :ignore_blank_passwords
# object level attribute overrides the config level
# attribute
def ignore_blank_passwords?
ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
end
end
现在在您的控制器中,将ignore_blank_passwords
属性设置为false。
user.ignore_blank_passwords = false
在这里,您正在AuthLogic的范围内工作。您不必更改验证逻辑。
答案 2 :(得分:2)
User.ignore_blank_passwords = false
使用model而不是object来设置此属性。
def update_passwords
User.ignore_blank_passwords = false
if @user.update_attributes(params[:user])
...
end
User.ignore_blank_passwords = true
end
答案 3 :(得分:1)
也许测试控制器中参数的值? (航空代码):
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
if @user.password.blank?
flash[:error] = "Password cannot be blank"
render :action => :edit
return
end
if @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
答案 4 :(得分:1)
除了zetetic的解决方案,你可以这样做:
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
if @user.changed? && @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
您基本上检查authlogic是否更改了用户记录(如果密码为空则不会更改)。在else块中,您可以检查密码是否为空,并向用户记录添加相应的错误消息或显示Flash消息。