2011-08-14 67 views
1

我在用于用户认证的我的Rails 3.0.9应用程序中使用Devise。因为我想能够管理用户,我创建了以下用户控制器:Rails 3在没有注销的情况下设计更新密码

class UsersController < ApplicationController 

    def index 
    @users = User.all 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     flash[:notice] = "Successfully created User." 
     redirect_to users_path 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    params[:user].delete(:password) if params[:user][:password].blank? 
    params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank? 
    if @user.update_attributes(params[:user]) 
     if current_user.update_with_password(params[:user]) 
      sign_in(current_user, :bypass => true) 
     end 
     flash[:notice] = "Successfully updated User." 
     redirect_to users_path 
    else 
     render :action => 'edit' 
    end 
    end 

    def destroy 
    @user = User.find(params[:id]) 
    if @user.destroy 
     flash[:notice] = "Successfully deleted User." 
     redirect_to users_path 
    end 
    end 

end 

我这个作品的展示,创建和删除用户,但我已经更新密码时遇到问题。

当我更新当前登录帐户的密码时,它会自动将我注销。

在控制器我试图解决这个问题使用:(你可以看到它在上面的代码)

if current_user.update_with_password(params[:user]) 
    sign_in(current_user, :bypass => true) 
end 

但是,这给了我这个错误 - >

undefined method `update_with_password' for nil:NilClass 

我是什么真正需要的是能够更新任何账户密码,而无需注销(因为管理员可以更改常规用户密码)。

回答

8

这是没有必要写

这段代码在控制器

if current_user.update_with_password(params[:user]) 
    sign_in(current_user, :bypass => true) 
end 

相反,你应该用下面一个

if @user.update_attributes(params[:user]) 
    sign_in(current_user, :bypass => true) 
    redirect_to users_path 
end 

欢呼:)

1

最简单的继续如何做到这一点叫

sign_in(current_user, :bypass => true) 

更新后。

这是我的控制器的动作是什么样子:

def update_password 
    if current_user.update_with_password(params[:user]) 
    sign_in(current_user, bypass: true) 
    flash[:notice] = "Updated Password Successfully" 
    else 
    flash[:error] = "There was an error updating your password, please try again." 
    end 
end 

我认为这基本上是什么@challenge提出,但我只想做一点更清洁和更容易理解。

相关问题