2016-07-09 7 views
1

특정 상황에서 hidden_field_tag와 양식이 어떻게 작동하는지 이해하기가 어렵습니다. 누군가가 나에게 설명해주기를 바랍니다.비밀 번호 재설정 양식에서 hidden_field_tag는 어떻게 작동합니까?

재설정 비밀번호의 형식은 railstutorial입니다.

내보기는 다음과 같습니다

<% provide(:title, 'Reset password') %> 
<h1>Reset password</h1> 

<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= form_for(@user, url: password_reset_path(params[:id])) do |f| %> 
     <%= render 'shared/error_messages', object: f.object %> 

     <%= hidden_field_tag :email, @user.email %> 

     <%= f.label :password %> 
     <%= f.password_field :password, class: 'form-control' %> 

     <%= f.label :password_confirmation, "Confirmation" %> 
     <%= f.password_field :password_confirmation, class: 'form-control' %> 

     <%= f.submit "Update password", class: "btn btn-primary" %> 
    <% end %> 
    </div> 
</div> 

내 업데이트 작업 및 강한 PARAMS 방법 :

def update 
    if params[:user][:password].empty? 
     @user.errors.add(:password, "can't be empty") 
     render 'edit' 
    elsif @user.update_attributes(user_params) 
     log_in @user 
     @user.update_attribute(:reset_digest, nil) 
     flash[:success] = "Password has been reset." 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

    def user_params 
    params.require(:user).permit(:password, :password_confirmation) 
    end 

액세스 편집 작업은, 사용자가 이메일 주소를 입력 할 때 응용 프로그램이 링크를 보내 이 경로와 같은 활성화 토큰을 포함한 이메일 :

/password_resets/9Ij91DFChTeWTitNDVJfYw/edit?email=example%40railstutorial.org 

사용자가이 링크를 열고 암호. 그것은 완벽하게 기능합니다. 내 질문 : 편집 동작에서 이미 사용자가 있고 내 업데이트 작업에서 명시 적으로 params[:email] (hidden_field_tag와 함께 제공)을 사용하지 않은 경우 숨겨진 태그가 필요한 이유는 무엇입니까?

답변

1

작업은 서로 다릅니다. edit 작업의 범위에서 암호 재설정 양식을 처음 렌더링하면 @user 인스턴스 변수가 이전에 어떻게 든 초기화되고 숨겨진 전자 메일 필드의 값을 제공하는 데 사용됩니다.

나중에 사용자가 양식을 제출하면 해당 데이터는 완전히 별도의 요청으로 update 작업에 의해 처리됩니다. 이 요청은 이전에 어떤 일이 있었는지, 특히 양식이 원래 edit 작업에 의해 렌더링 된 것임을 알지 못합니다. 또한 edit 조치 범위에 있었던 오브젝트에 액세스 할 수 없습니다.

요청을 처리하려면 update 조치 코드가 새로 필요한 모든 객체를 초기화해야하며 이는 주로 @user 객체입니다.

현재 조치가 이전에 어떤 일이 발생했는지 알 수없는 경우 어떤 사용자 레코드가 @user 변수로 가야하는지 어떻게 알 수 있습니까? 이메일로 사용자를 찾을 수 있기 때문에 매개 변수로 제공 한 것입니다. edit 조치 코드가 다음 요청에 사용 가능하게했습니다.

동작의 모양이 edit 일 때 이미 동작 코드가 실행되기 전에 @user 개체를 초기화하는 컨트롤러에 몇 가지 방법이 있어야합니다. before_action 콜백을 찾으십시오.

아마도이 메서드는 params에 전달 된 전자 메일을 통해 사용자를 조회합니다. 동작 자체가 실행되면 @user 객체가 이미 있으므로 레일스를 어떻게 든 얻는 방법을 알 수 있습니다. 그렇게하지 않으면 컨트롤러 코드가 이런 일을합니다.

따라서 작업 사이에 컨텍스트를 전달하려면 숨겨진 태그가 필요합니다. session 또는 cookies을 사용하는 것과 같은 다른 방법이 있지만 이렇게하는 것이 가장 간단합니다.

+0

당신은 황소의 눈을 맞았습니다! 나는''update'' 액션을위한''before_action''을 가지고''params [: email]''에 의해 사용자를 찾습니다. 이것은 훨씬 더 의미가 있습니다, 감사합니다! – rwehresmann

+0

@nic 우리가'session' 또는'cookies'를 사용할 수 있다고 말하는 것은 무엇입니까?사용자가 아직 로그인하지 않았 으면 암호를 잊어 버렸습니다. – truongnm

+0

사용자가 로그인했는지 여부에 관계없이 세션 및 쿠키를 사용할 수 있습니다. 프로그래머가 어느쪽에 놓을 지 결정하는 것은 프로그래머의 선택입니다. –