ユーザーを特定する

初めに

Progateを学習して躓いたところを中心にアウトプットし、備忘録としても活用していきます。

ログインするユーザーを特定していく。

  • find_byメソッドを利用していく。

  • 今回はpasswordとemailの2つからユーザーを特定していく

  • ユーザーテーブルからフォームで入力された値と一致するユーザーを見つけ出し、@userに代入する

    users_controller
def login
    @user = User.find_by(email: params[:email], password: params[:password])
end

if文を使って存在するユーザーなのか、存在しないユーザーなのか判別する。

users_controller
def login
    @user = User.find_by(email: params[:email], password: params[:password])
 if @user
    flash[:notice] = "ログインしました"
 redirect_to("/posts/index")
 else
   render("users/login_form")
    
end
  • if @user ではemailとpasswordが一致するユーザーがいるのならばというコード。

  • 一致するユーザーがいた場合、flash[:notice] = "ログインしました"が表示される。

  • そして投稿一覧ページに遷移する。

  • もし一致するユーザーがいなければ、ログインページに戻る。

ユーザーがいなかった場合、エラーメッセージを表示させる

users_controller
def login
    @user = User.find_by(email: params[:email], password: params[:password])
 if @user
    flash[:notice] = "ログインしました"
 redirect_to("/posts/index")
 else
   @error_message = "メールアドレスまたはパスワードが違います"
   render("users/login_form")
    
end
  • バリデーションによって表示させるエラーメッセージではないので、@error_message = "メールアドレスまたはパスワードが違います"のように 自作でエラーメッセージを作る。
login_form.html.erb
 <div class="form-body">
        <% if @error_message %>
          <div class="form-error">
           <%= @error_message %>
          </div>
        <% end %>
        <%= form_tag("/login") do %>
          <p>メールアドレス</p>
          <input name="email" value="<%= @email %>">
          <p>パスワード</p>
          <input type="password" name="password" value="<%= @password %>">
          <input type="submit" value="ログイン">
        <% end %>
      </div>
  • reder先のlogin_form.htmlに@error_messageを貼り付け、メールアドレスとパスワードが一致しない場合はエラーメッセージが表示できるようにす る。

結語

  • find_byメソッドを利用して登録したユーザーを見つけ出す。

  • if 文を利用して登録済みユーザーが未登録ユーザーなのかを判別する。

  • flashメッセージを利用してログインができたことを表示させる。

  • バリデーションではないエラーメッセージの場合は@error_messageのような自らエラー表示用のインスタン変数を作り出し、メッセージを記述し、 表示させたいビューに貼り付ける。