ログイン画面の実装をする際に入力する値に対してストロングパラメーターを実装する方法を紹介します。
form_foからログイン情報を入力する
# app/view/sessions/new.html.erb
...
<%= form_for :session, url: login_path do |f|%>
<div class="form-group">
<%= f.label :email, class: "text-white"%>
<%= f.text_field :email, class:"form-control"%>
</div>
<div class="form-group">
<%= f.label :password, class: "text-white" %>
<%= f.password_field :password,class: "form-control" %>
</div>
<%= f.submit "ログイン",class:"btn-block btn-white"%>
<% end %>
...
# config/routes.erb
Rails.application.routes.draw do
...
post "/login", to: "sessions#create"
...
end
このフォームに「email」と「password」を入力してログインボタンを押すと、
paramsの中にsessionというハッシュがpostされます。
sessionの中にはemailとpasswordに関するハッシュが含まれています。
コントローラーでストロングパラメーターを設定する
# app/cotroller/sessions_controller.rb
class SessionsController < ApplicationController
...
def create
user =User.find_by(email_params)
if user && user.authenticate(password_params[:password])
log_in user
redirect_to root_path,success: "ログインに成功しました"
else
flash.now[:danger]="ログインに失敗しました"
render :new
end
end
...
private
def log_in(user)
session[:user_id]=user.id
end
def email_params
params.require(:session).permit(:email)
end
def password_params
params.require(:session).permit(:password)
end
...
end
createメゾットの中を説明していきます。
まず、ここではfind_byによってUserテーブルからemail_paramsに合った最初の値を取得します。
user =User.find_by(email_params)
email_paramsはprivate以下にあるメゾットです。
private以下にあるため、class外から呼び出すことができません。
ここでrequireメソッドによって、paramsから引数に設定したsessionの値を取得することができます。
そしてpermitメソッドによってsessionの中のemailの値だけの使用を許可します。
passwordも同じように設定します。
def email_params
params.require(:session).permit(:email)
end
次にその下のif文でuserとuser.authenticate()がTrueのとき
ログインが成功するようになっています。
authenticateメソッドは、引数に指定したパスワードの値と、userテーブルに登録されているpasswordと一致しているかを検証します。
if user && user.authenticate(password_params[:password])
ただし、このメゾットを使う場、modelsのuser.rbでhas_secure_passwordの記述が必要です。
# app/models/user.rb
class User < ApplicationRecord
...
has_secure_password
...
end
再び、sessions_controller.rbのcreateメゾットに戻ります。
log_in user
はprivateのlog_in()メゾットの引数にuserを渡しています。
次の行のコードのredirect_toで第1引数に指定したURLにリダイレクトされます。
# app/cotroller/sessions_controller.rb
log_in user
redirect_to root_path,success: "ログインに成功しました"