2013-03-26 59 views
4

我使用deviseauthentication和我有每個用戶的role,我允許與admin角色的用戶創建新的用戶,我想管理員用戶edit the password爲用戶剩下的,如果他們忘記了自己的密碼。但是我無法在編輯中改變沒有當前密碼的密碼。那麼我怎樣才能允許管理員用戶通過編輯用戶密碼來改變密碼,並像我們爲其餘的值一樣保存。如何在設計中更改沒有當前密碼的密碼?

+0

當您嘗試更改另一個用戶的密碼時會發生什麼?我只是使用我在下面發佈的代碼做得很好。 – Catfish 2013-03-26 14:56:19

回答

2

有一個方法內置設計稱爲update_without_password

下面是我用我的更新方法是什麼:

# PUT /manage_users/1 
    # PUT /manage_users/1.json 
    def update 
    @user = User.find(params[:id]) 
    able_to_edit_profile? 

    # required for settings form to submit when password is left blank 
    if params[:user][:password].blank? 
     params[:user].delete("password") 
     params[:user].delete("password_confirmation") 
    end 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     @user.save   

     # sign the user in with their new password so it doesn't redirect to the login screen 
     sign_in @user, :bypass => true 

     format.html { 
      flash[:notice] = 'User was successfully updated.' 
      redirect_to session.delete(:return_to) 
     } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit", notice: 'Error updating user.' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

private 

    # If the user is not an admin and trying to edit someone else's profile, redirect them 
    def able_to_edit_profile? 
    if !current_user.try(:admin?) && current_user.id != @user.id 
     flash[:alert] = "That area is for administrators only." 
     redirect_to :root 
    end 
    end 
+0

實際上,如果我們想更改其他值而不提供密碼,但我們無法更新密碼,則可以使用此update_without_password。 – logesh 2013-03-26 14:39:34

+0

我用'if params [:user] [:password] .blank? params [:user] .delete(「password」) params [:user] .delete(「password_confirmation」) end'但帶有@ user.update_attributes(params [:user]),它現在可用。 – logesh 2013-03-28 15:17:44

+0

啊很高興知道。實際上,我昨天剛剛遇到了一個問題,並且注意到這段代碼並未改變用戶密碼。我會用你的解決方案來解決我的問題。很高興我們可以一起解決我們的兩個問題。 – Catfish 2013-03-28 15:25:40

12

由於update_without_password仍然需要current_password更新密碼,你就必須有一個update這樣的:

def update 
    # required for settings form to submit when password is left blank 
    if params[:user][:password].blank? 
     params[:user].delete("password") 
     params[:user].delete("password_confirmation") 
    end 

    @user = User.find(current_user.id) 
    if @user.update_attributes(params[:user]) 
     set_flash_message :notice, :updated 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to after_update_path_for(@user) 
    else 
     render "edit" 
    end 
    end 

這示例用於更新當前用戶(包括用戶的密碼),但您可以對其進行修改以適應您的需求。

+0

是的,這是正確的答案 – 2015-10-08 10:08:25

3
@user.update_attributes(password: params[:user][:password]) 
+0

@Luke什麼錯了?我不明白你編輯我的答案。你沒有在我的答案中提供任何代碼。 – chegoon 2014-10-27 08:22:21

+0

如果您在編輯時檢查註釋,它會顯示「添加了代碼標籤」。這將您的答案中的代碼格式化爲灰色框,這使得它更易於閱讀並且更容易複製/粘貼。 – Luke 2014-10-27 08:25:34

+0

@Luke感謝您的通知:) – chegoon 2014-10-27 08:38:40