【136日目】【1日20分のRailsチュートリアル】【第10章】パスワード再設定フォームを実装する
今日は「10.2.4 パスワードを再設定する」から。
10.2.4 パスワードを再設定する
フォームリンクが動作するためには、パスワード再設定のフォームが必要です。
この作業はユーザーのeditビューでユーザーを更新する (リスト9.2) のと似ていますが、今回はパスワード入力フィールドと確認用フィールドだけを使います。 (中略) このメールアドレスの最適な保存方法は、隠しフィールドとしてページ内に保存することです。
画面にはパスワード入力フィールドとパスワード確認用フィールドのみが表示されるけど、隠しフィールドでメールアドレスも送るようにするのか…!
app/views/password_resets/edit.html.erb
<% 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' %> <%= 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[:email]に保存されますが、後者を使用するとparams[:user][:email]に保存されてしまうからです。
どっちでも良くない?なんて思ってしまったけど、取り出すときに後者だとできないのかな…。
このフォームを出力 (レンダリング) するためにPasswordResetsコントローラのeditアクション内で@userインスタンス変数を定義する必要があります。
before_action
で@userインスタンス変数を定義して正当なアカウントか確認する。
app/controllers/password_resets_controller.rb
before_action :get_user, only: [:edit, :update] before_action :valid_user, only: [:edit, :update] : def edit end private def get_user @user = User.find_by(email: params[:email]) end # 正しいユーザーを確認する def valid_user unless (@user && @user.activated? && @user.authenticated?(:reset, params[:id])) redirect_to root_url end end
サーバー起動して画面見てみようとしたらサーバー起動しない…!
$ rails server -b $IP -p $PORT : A server is already running. Check /home/ubuntu/workspace/sample_app/tmp/pids/server.pid. Exiting
次のとき調べよう…psコマンドでそれらしいプロセスないんだけどな…。
今日の学習時間は【20分】。
次は「10.2.4 パスワードを再設定する」のupdateアクションを定義するところから。
でもその前にサーバー起動できるようにするところから。。