8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ストロングパラメーターを設定する

Last updated at Posted at 2019-01-26

ログイン画面の実装をする際に入力する値に対してストロングパラメーターを実装する方法を紹介します。

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: "ログインに成功しました"
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?