2013-05-17 19 views
5

我试图做到这一点。不幸的是,我有覆盖更新的问题,我不知道如何正确地做到这一点。的方式我这样做,在另一个地方是:ActiveAdmin - 修改用户而不更改密码

if params[:user][:password].blank? 
    params[:user].delete("password") 
    params[:user].delete("password_confirmation") 
end 
# ... 
user.save! 

于是,我就重写update

def update 
    if params[:user][:password].blank? 
    params[:user].delete("password") 
    params[:user].delete("password_confirmation") 
    end 
    super 
end 

但它没有工作。我仍然在密码输入附近获得can't be blank。如何实现预期的行为?

回答

0

这是为我工作:

def update 
    @user = User.find(current_user.id) 
    params[:user].delete(:current_password) 
    if @user.update_without_password(params[:user]) 
     redirect_to .... 
    else 
     render .... 
    end 
end 

def update 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     params[:user].delete(:password) 
     params[:user].delete(:password_confirmation) 
    end 
    super 
end 

source

+0

我的解决方案也可以在删除'validates:password,:presence => true'后生效。我认为,该设备的验证是足够的。 – ciembor

9

将此代码添加到您的用户模型。这会为你解决问题。

# User.rb 

private  
def password_required? 
    new_record? ? super : false 
end 
+4

应该被标记为答案 – phyzalis

16

我拿@anonymousxxx的答案,并添加以下内容:

如果您使用的轨道管理员,您可以覆盖控制器“用户”的方法如下:

#app/admin/user.rb 
controller do 
    def update 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     params[:user].delete("password") 
     params[:user].delete("password_confirmation") 
    end 
    super 
    end 
end 

您还应该注意,如果您拥有用户模型验证,请指定何时应用此类验证,例如:

validates :name, :email, presence: true 
validates :password, :password_confirmation, presence: true, on: :create 
validates :password, confirmation: true 

这允许我仅在创建新用户时进行密码验证并在不更改密码的情况下进行更新。

我希望这是有帮助的。