読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【136日目】【1日20分のRailsチュートリアル】【第10章】パスワード再設定フォームを実装する

Ruby on Railsチュートリアル(第3版)

今日は「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アクションを定義するところから。
でもその前にサーバー起動できるようにするところから。。