ログイン機能を作る(1) Ruby on Rails

概要

ログインユーザ以外に利用できないシステムにしたいので、ログインシステムを作る。

  • アカウントを持っているユーザのみ閲覧できるページ
  • ログイン機能
  • ログイン状態の維持、ログアウト

ログインコントローラーの作成

$ rails g controller Sessions new

まずは、コントローラーとログインページとしてのnew.html.erbを作成

ルーティングの設定

ログインページを作る

ログイン機能を作る

ログインフォームから受け取る値は、params[:email]とparams[:password]のようですが、
form_with でscope::session を指定したことによる、parametersのキー値として「session」が設定される。さらにsessionのキー値として「email」と「password」が割り当てられるので、
ここから取得される値は、params[:session][:email],paramas[:session][:password]となる。

form_with scopeオプション

オプションにモデルを指定せず(モデルに基づかないコントローラーなどの場合)に、scope オプションをすると、その値が inputフィールドの name属性の値のプレフィックスになる。上の設定の場合、form_with メソッドには、別途 url オプションが必要になる。

<%= form_with(scope: :post, url: posts_path, local: true) do |f| %>
 <%= f.label :title %>
<% end %>
これによりHtml上は
<form action="posts" ..............>
<imput ... name="post[title]">
</form>

したがって、ログイン機能自体は 

user = User.find_by(email: params[:sesiion][:email].downcase

でまず、まずログインしようとしているユーザー情報を取得する。次にパスワード認証をする。

user.authenticate(params[:session][:password])

authenticateメゾット

引数の文字列がパスワードと一致するとUserオブジェクトを、間違っているとfalseを返すメソッド

詳細はこちら

ここまでのまとめ

ログインしようとしているユーザー情報を取得して、かつパスワード認証

user = User.find_by(email: params[:session][:email].downcase
user.authenticate(params[:session][:password])

ログイン機能実装

どのファイルに記載していくか問題??
このログイン状態であるかどうかは多くのページで問題になります。
したがって、今作成した”sessions_controller”上に定義しても、sessions/new.html.erbにしか使えない。じゃあ、sessions_helper_rbに定義すれば良いのでは?いやそれでも結論は変わらない。全クラスで利用することになるので、全クラスの親クラスである”application_controller.rb”に記載するかもしくは、この”sessions_helper_rb”を読み込ませることで、全コントローラーで使用できるようにする。
次に、そもそもログインとは問題??
毎ページごとに、ユーザー情報を取得、パス認証をするのは、dbへの過剰アクセスになるし、そもそもユーザーは面倒。そこで、ブラウザのcoolieを利用する。ここにidを残しておけばいいんじゃない?
つまり、一度ユーザー情報を取得し、パス認証をクリアした人のブラウザにid(通行手形)を残しておいて、以後、通行手形の有無のみで判断していこうというもの
session[:user_id] = user.id

これで、通行手形となるid番号を定義する。

これは、引数(user:まだ誰だかわからない)のuserモデルに保存されているidを通行手形のsession[:user_id]とするヘルパーメゾット。なので、まずuserを取得しなければならないが、これは先ほど定義したので、ここで合体する。これでログイン状態となる

user = User.find_by(email: params[:session][:email].downcase
user.authenticate(params[:session][:password])
log_in user 引数を表す()は省略可能

コメント

タイトルとURLをコピーしました