0

我按照github 上的 Authlogic 示例教程进行了设置和运行。但我想对密码确认进行更改。

按照教程,注册时必须输入密码确认。我不希望那是必要的,所以我把它放在c.require_password_confirmation = falseacts_as_authentic块中。但这完全消除了密码确认。当他们更改密码时,我仍然希望编辑用户页面的密码确认。我还想将它用于“重置密码”页面(我目前没有设置)。

我该怎么做呢?

此外,虽然没有那么重要,但在 Edit User 页面上,目前所有内容都是一种形式,其中一个 Update def 在UsersController. 因此,如果有人想更改其他一些信息,他们还必须输入他们当前的密码,因为我目前已将其设置为...

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

我最好拥有它,这样只有在他们更改电子邮件地址或输入新密码时才要求他们输入旧密码。


用户.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

4

1 回答 1

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)用户重置密码。

希望这可以帮助。

于 2010-08-28T10:52:46.933 回答