2013-07-15 2 views
3

그래서이 간단한데 관리자와 같은 사용자 암호를 변경, 나는 다음과 같습니다 컨트롤러 액션이 있습니다고안 :

class Admin::UsersController < Admin::BaseController 
... 
def update_password 
    @user = User.find(params[:user][:id]) 
    @user.password = params[:user][:password] 
    if @user.save! 
    Notifier.admin_password_change(@user).deliver 
    flash[:success] = "Password Changed!" 
    redirect_to edit_admin_user_path(@user) 
    else 
    render "edit" 
    end 
end 
end 

을하며 작동하는 것 같다 없다. 여기에 좀 더 진보 된 것이 필요합니까? 다음은 레일 콘솔에서 볼 수 있습니다.

Started PUT "/admin/users/update_password" for 127.0.0.1 at 2013-07-15 10:01:50 -0600 
Processing by Admin::UsersController#update_password as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"ipedx2MJDZTQct6I4FUObrzDpMNl3pQWNVr9Ez7bDVc=", "user"=>{"id"=>"226", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Change Password"} 
    (6.8ms) ALTER SESSION SET EDITION = EPACT_REDESIGN 
    User Load (8.4ms) SELECT "CRED_APP_USERS".* FROM "CRED_APP_USERS" WHERE "CRED_APP_USERS"."ID_NUMBER" = 10040 AND ROWNUM <= 1 
    CodeModel Load (9.1ms) SELECT "CRED_CODES".* FROM "CRED_CODES" WHERE (table_name = 'CRED_VEHICLES' OR table_name = 'CRED_FLEET') 
    User Load (3.6ms) SELECT "CRED_APP_USERS".* FROM "CRED_APP_USERS" WHERE "CRED_APP_USERS"."ID_NUMBER" = :a1 AND ROWNUM <= 1 [["id_number", "226"]] 
    (3.3ms) UPDATE "CRED_APP_USERS" SET "ENCRYPTED_PASSWORD" = 'ENCRYPTED PASSWORD STRING', "MODIFY_DT" = TO_DATE('2013-07-15 16:01:50','YYYY-MM-DD HH24:MI:SS') WHERE "CRED_APP_USERS"."ID_NUMBER" = 226 
Rendered notifier/admin_password_change.erb (0.1ms) 

Sent mail to [email protected] (22ms) 
... 

여기서 내가 뭘 잘못하고 있니? 전자 메일이 콘솔에 출력되고 화면 상단에 :success 플래시가 표시되지만 암호는 변경되지 않았습니다.

답변

3

왜 그런지 이해할 수는 없지만 password_reset_token을 설정해야합니다. 여기에 방법이 지금의 모습의 다음 reset_password! 방법이 실행될 때 토큰 GET의가 날아

def update_password 
    @user = User.find(params[:user][:id]) 
    @user.reset_password_token = 'temp' 
    @user.save! 
    if @user.reset_password!(params[:user][:password], params[:user][:password_confirmation]) 
    Notifier.admin_password_change(@user).deliver 
    flash[:success] = "Password Changed!" 
    redirect_to edit_admin_user_path(@user) 
    else 
    render "edit" 
    end 
end 

. 나는 reset_password_token을 필요로하는 것을 암시하는 문서에서 아무 것도 찾을 수 없지만, 필요할 것으로 보인다. 나는이 코드가 예쁘다고 말하지 않겠지 만 해결책은 효과가있다. 다른 누군가가 더 나은 것을 발견하면 내 대답을 바꿀 것입니다.