2016-07-09 3 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 

アクセスeditアクションは、ユーザーがメールアドレスを入力するとアプリがこれにリンクを送信このパスのようなアクティベーショントークンを持つ電子メール:

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

このリンクを開いて、パスワード。それは完全に機能的です。私の質問は、編集アクションのユーザーがすでにいて、更新アクションで​​(hidden_​​field_tagに付属)を明示的に使用していない場合、なぜ非表示タグが必要なのですか?

答えて

1

アクションは互いに独立しています。最初にeditアクションの範囲でパスワードリセットフォームをレンダリングすると、以前に何らかの形で初期化された@userインスタンス変数が、非表示の電子メールフィールドの値を提供するために使用されます。

後でユーザーがフォームを送信すると、そのデータは完全に別の要求でupdateアクションによって処理されます。この要求は、前に何が起こったのか、具体的にはフォームが最初にeditアクションによってレンダリングされたことを知らない。また、editアクションの対象となっていたオブジェクトにアクセスすることもできません。

要求を処理するには、updateアクションコードは、新たに必要なすべてのオブジェクトを初期化する必要があります。これは主に@userオブジェクトです。

どのようなユーザーレコードが変数@userに送信されるのか、現在の処理で以前に何が起こったのかわからない場合はどうすればよいでしょうか?それは電子メールでユーザーを見つけることができます。これがparamsで提供された理由です。あなたのeditアクションコードは、次のリクエストで利用可能にしました。

あなたのeditアクションの外観から、アクションコードが実行される前に、@userオブジェクトを初期化するいくつかのメソッドがコントローラに既に存在するはずです。 before_actionコールバックを探します。

この方法では、おそらくparamsに渡された電子メールでユーザーを検索します。アクション自体が実行されると、@userオブジェクトはすでにそこにあるので、Railsは何とかそれを取得する方法を知っているように思えるかもしれません。そうではありません、あなたのコントローラコードがこれを起こします。

したがって、アクション間でコンテキストを渡すには、非表示のタグが必要です。 sessionまたはcookiesを使用するなど、他の方法もありますが、この方法はおそらく最も簡単です。

+0

あなたは雄牛の目を打つ!私は '' update''アクションの '' before_action''を '' params [:email] ''でユーザを見つけています。これはもっと感謝しています。ありがとう! – rwehresmann

+0

@nic私たちは 'session'や' cookies'を使うことができますか?ユーザーはまだログインしていません。パスワードを忘れてしまった – truongnm

+0

ユーザーがログインしているかどうかに関係なく、セッションとCookieを利用できます。プログラマがどちらに配置するかは選択肢です。 –

関連する問題