2013-03-26 2 views
4

나는 authentication에 대한 devise를 사용하고 그리고 난 각 사용자에 대한 role을하고 난 admin 역할을 가진 사용자가 새로운 사용자를 생성 할 수 있도록하고 그들이 자신의 암호를 잊어 버린 경우 나 사용자의 나머지 edit the password에 admin 사용자를 원한다. 하지만 편집 할 때 현재 비밀번호가 없으면 비밀번호를 변경할 수 없습니다. 그렇다면 어떻게해야 admin 사용자가 사용자 비밀번호를 편집하여 비밀번호를 변경하고 나머지 값들과 마찬가지로 비밀번호를 저장할 수 있습니다.현재 암호없이 암호를 변경하는 방법은 무엇입니까?

+0

다른 사용자의 암호를 변경하려고하면 어떻게됩니까? 나는 jsut 그냥 아래에 게시 된 코드를 사용하여 잘 했어. – Catfish

답변

2

update_without_password라고하는 방법이 있습니다.

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 

이를이 같은 update을 가지고 여전히 암호를 업데이트 current_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

+0

나는 'if params [: user] [: password] .blank를 사용 했습니까? (user)] params [: user] .delete ("password") params [: user] .delete ("password_confirmation") end '그러나 @ user.update_attributes (params [: user])와 함께 작동합니다. – logesh

+0

아, 잘 알고 있습니다. 사실 어젯밤에 문제가 발생하여이 코드가 사용자 비밀번호를 변경하지 못하는 것으로 나타났습니다. 내 문제를 해결하기 위해 귀하의 솔루션을 사용합니다. 다행스럽게도 우리는 두 문제를 함께 해결할 수있었습니다. – Catfish

12

update_without_password 때문에, 당신은해야합니다 : 여기

내가 내 업데이트 방법으로 사용하고 무엇을 예는 현재 사용자 (사용자의 비밀번호 포함)를 업데이트하기위한 것이지만 필요에 맞게 수정할 수 있습니다.

+0

맞습니다. 대답은 –

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

입니다. @ 루크 무엇이 잘못 되었나요? 내 대답을 편집 한 내용을 이해하지 못합니다. 내 대답에 어떤 코드도 넣지 않았다. – chegoon

+0

편집에서 메모를 확인하면 "코드 태그 추가"라고 표시됩니다. 이렇게하면 대답의 코드가 회색 상자로 표시되므로 읽기가 쉬우 며 복사/붙여 넣기가 더 쉬워집니다. – Luke

+0

@ 루크 감사합니다. :) – chegoon

관련 문제