我跟着Authlogic example tutorial at github并设置并运行了所有内容。但我想对密码确认进行更改。
遵循本教程,您必须在注册时输入密码确认。我不希望这是必要的,所以我将c.require_password_confirmation = false
放在acts_as_authentic
块中。但这完全取消了密码确认。我仍然希望在编辑用户页面上有密码确认,以便他们更改密码。我也想把它用于重置密码页面(我目前还没有设置)。
我该怎么做?
此外,虽然不那么重要,但在“编辑用户”页面上,所有内容当前都是一个表单,UsersController
中有一个更新def。因此,如果有人想要更改其他信息,他们还必须输入他们当前的密码,因为我目前已将其设置为......
def update
@user = current_user
if @user.valid_password?(params[:user][:old_password])
if @user.update_attributes(params[:user].reject{|key, value| key == "old_password"})
flash[:notice] = 'Successfully updated profile.'
render :action => :edit
else
render :action => :edit
end
else
flash[:notice] = 'Your old password is wrong.'
render :action => :edit
end
end
我最好喜欢这样,只要他们更改电子邮件地址或输入新密码,只需要输入旧密码。
user.rb 的
class User < ActiveRecord::Base
acts_as_authentic do |c|
c.require_password_confirmation = false
end
attr_accessor :old_password, :reset_password
validate :old_password_valid, :on => :update, :unless => [:reset_password]
def old_password_valid
errors.add(:old_password, "You must introduce your password") unless valid_password?(old_password)
end
def require_password?
password_changed? || (crypted_password.blank? && !new_record?) || reset_password
end
def deliver_password_reset_instructions!
reset_perishable_token!
Notifier.deliver_password_reset_instructions(self)
end
end
答案 0 :(得分:0)
我会这样做,添加访问器old_password,reset_password(重置密码时设置为true的布尔值):
attr_accessor :old_password, :reset_password
现在,我们需要在更新时验证旧密码,但不能重置:
validate :old_password_valid, :unless => [:reset_password]
def old_password_valid
errors.add(:old_password, "You must introduce your password") if !new_record? && !valid_password?(old_password)
end
到目前为止,我们已经验证了旧密码在用户更新其个人资料时有效。
现在,为了询问新密码,Authlogic添加了一个方法'require_password?'对于您的用户模型,您必须覆盖它。我这样做了:
def require_password?
password_changed? || (crypted_password.blank? && !new_record?) || reset_password
end
基本上要求密码(和确认)时:1)用户更新密码,2)用户激活他们的帐户(所以他们仍然没有密码),3)用户重置密码。
希望这有帮助。