2017-04-04 1 views
3

신청서 내에서 Devise::RegistrationsController을 통해 렌더링되는 등록/수정 양식이 있습니다. 현재 작동하는 방식으로 양식을 업데이트 할 때 현재 비밀번호를 제공해야합니다. 그들이 작동하게하는 방법은 current_passwordpassword 필드를 업데이트 할 때만 필요하거나 확인을 위해 "new_password"를 반복해야한다는 것입니다. Devise 위키에서 주로 다음 링크를 읽었으며 이것에 대한 해결책을 나열하지 않습니다. 누군가가 이것이 달성 될 수있는 방법에 대한 통찰력을 가지고 있다면 나는 그것을 고맙게 생각할 것이다.비밀번호 찾기 등록을 변경할 때만 비밀번호 필요

가있는 경우이 방법 : 당신이 할 수있는 일

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

답변

1

저는이 문제를 해결하기 위해 파고 들었습니다. 해결책을 찾았습니다. 내 모델 (user.rb)에서

내가 다음 코드 조각에 :validatable 추가 : 마지막

def update_resource(resource, params) 
    if !params[:password].blank? 
    resource.password = params[:password] 
    resource.password_confirmation = params[:password_confirmation] 
    end 

    resource.update_without_password(params) 
end 

그리고에서 : 내 등록 컨트롤러에서 다음

devise :omniauthable, :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, 
    :confirmable, :trackable, reset_password_keys:[:email, :company_id], 
    request_keys: [:host, :params], omniauth_providers: [:auth0] 

, 나는 다음과 같은 추가 내 응용 프로그램 컨트롤러 인 경우 :password_confirmation을 다음 스 니펫에 추가했습니다.

devise_parameter_sanitizer.permit(:account_update) do |u| 
    u.permit(:first_name, :last_name, :email, :password, :password_confirmation, :phone_number, :receive_emails, 
      location_attributes: [:id, :street, :city, :state, :zip, :country]) 
end 

이 조합을 사용하면 양식을 제출하면 덮어 쓰는 update_resource 블록에 들어갑니다. resource.passwordpassword_confirmation이 동일한 지 확인합니다. 그 중이 빠졌으므로 더 이상 변경 사항을 저장하기 위해 암호를 입력 할 필요가 없습니다.

1

사용자가 PARAMS params[:user][:password]params[:user][:password_confirmation]을 통해, 자사의 계정에 업데이트를 수행하는 시간에 확인하는 것입니다 password 또는 password_confirmationuser_params을 전달하는 update_without_password 메서드를 사용하고 다른 방법은 update_attributes 메서드

을 사용하는 것입니다.
def update 
    ... 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     if @user.update_without_password(user_params) 
     flash[:notice] = 'User updated successfully' 
     redirect_to some_path 
     else 
     render :edit 
     end 
    else 
     if @user.update_attributes(user_params) 
     # login before update passing the current user 
     sign_in(User.find(current_user.id), :bypass => true) 
     flash[:notice] = 'User updated successfully' 
     redirect_to some_path 
     else 
     render :edit 
     end 
    end 
    ... 
    end 
+0

도움을 주셔서 감사합니다. 결과적으로 나에게 적합하지 않습니다. 나는 내가 발견 한 해결책을 게시하는 것을 끝내었다. –

관련 문제