2011-04-28 4 views
2

내 사용자 프로필 업데이트 양식에서 첫 번째 필드는 사용자에게 현재 암호를 입력하도록 요청합니다. 그녀가 양식을 제출하면 다른 필드의 변경 사항을 수락하기 전에 암호를 확인합니다. 여기에 내가 현재 사용자의 컨트롤러에이 일을 해요 방법은 다음과 같습니다프로필을 업데이트하려면 사용자가 암호를 입력하도록 요구하십시오.

def update 
    @user = User.find(params[:id]) 
    if @user.has_password?(params[:user][:password]) 
    if @user.update_attributes(params[:user]) 
     flash[:success] = "Profile updated." 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    else 
    flash[:failure] = "Password does not match!" 
    render 'edit' 
    end 
end 

내가 이것을 할 수있는 더 좋은 방법이 기분. 예를 들어 사용자 모델에서 유효성 검사와 일치하는 암호를 만들 수 있습니다. 그런 다음 formtastic은 자동으로 오류 메시지를 처리합니다 (위의 추악한 플래시 접근 방식과 반대 됨). 나는

validate :password_match?, :on => :update 

그리고

def password_match? 
    has_password(params[:user][:password]) 
end 

와 함께이 일을하지만 의심 PARAMS으로 모델에서 액세스 할 수 없습니다 시도.

이렇게하려면 길을 20 분 동안 찾았으므로 Devise 또는 Authlogic과 관련이없는 항목을 찾을 수 없습니다. 저는 처음부터 인증을하고 있습니다 (모든 것이 잘 작동합니다 : 로그인, 세션 등).

빛을 더 잘 보여주세요.

+0

(https : //로 GitHub의. co.kr/plataformatec/devise/blob/master/app/views/devise/registrations/edit.html.erb # L15) – Zabba

+0

다음에는 devise를 사용하겠습니다. 나는 레일즈를 최근에 배웠고 처음부터 인증을 만드는 튜토리얼을 따랐다. 그 이후로 내 프로젝트에서이 코드를 사용하고 있습니다. –

답변

1

관리자가 필요하지 않으므로 업데이트시컨트롤러의 필터를 사용하기 만하면됩니다.

before_filter password_match, :only => :update 

그런 다음 개인용으로 하단에 있습니다. 당신이 사용했다면 [유증은] (https://github.com/plataformatec/devise)이이 [편집 사용자 등록보기] 당신을 위해 내장 될


private 

def password_match 
    @user = User.find(params[:id]) 
    @user.has_password?(params[:user][:password]) 

+0

이 길은 나를 토끼의 구멍으로 끌고갔습니다. 문맥 속으로 끌어 넣는 것은 가치가 없을 것입니다. 우리는 여러 번 앞뒤로 가야합니다. 나는 원래의 해결책을 고집 할 것이다. 암호 필드에 사용자 정의 오류를 추가하기 위해 errors.add를 올바르게 사용하는 방법을 모르겠다는 사실에이를 수 있다고 생각합니다. 어쨌든 좋은 제안 이었기 때문에 대답을 수락합니다. –

+0

커피를 마시고 잠시 쉬십시오. 오류가 필요하지 않습니다. 화면 상단의 멋진 플래시 오류는 어때요? flash.now [: error] = '암호가 현재 암호와 일치하지 않습니다.'그리고 그것입니다 :) – daniel

+0

실제로 원래의 접근 방식은 위의 첫 번째 코드 샘플을 참조하십시오. 나는 그것에 충실하기로 결정했다. –

관련 문제