Rails ログイン機能 (055/100)

ログインフォーム

これまで習ってきた form_forform_for(@user) のようにインスタンス変数を指定して、そのインスタンス変数をコントローラに渡していた。

ログインフォームではリソースの名前( : session )とそれに対応するURLを指定する。( session にはモデルがないため。)

<%= form_for(:session, url: login_path) do |f| %>

ログインフォームのコード

<%= form_for(:session, url: login_path) do |f| %>
    <div class="form-group">
       <%= f.label :email, 'Email' %>
       <%= f.email_field :email, class: 'form-control' %>
    </div>
      
    <div class="form-group">
       <%= f.label :password, 'Password' %>
       <%= f.password_field :password, class: 'form-control' %>
    </div>
<% end %>

上のフォームで入力した値を session コントローラ側では、下のようにして取り出すことができる。

params[:session][:emnail]
params[:session][:password]

ログイン・認証機能

def login(email, password)
    @user = User.find_by(email: email)
    if @user && @user.authenticate(password)
      # ログイン成功
      session[:user_id] = @user.id
      return true
else

def current_user
    @current_user ||= User.find_by(id: session[:user_id])
end

ログインが成功すると、 session[:user_id] = @user.id が実行される。
つまり自分のアカウントのインスタンスidsession (ハッシュ)に登録される。
(sessionとは、サーバ側でログイン情報を保管して置く場所のこと。)

current_user メソッドは現在ログインしているユーザを取得するメソッド。
@current_useruser インスタンスが入って入れば、それを返す。
入っていなければ、session[:user_id] の値をUserモデル(全ユーザーのリスト)から探して、
現在ログインしているユーザを特定し、そのインスタンスを返す。

login成功したら、@current_user の中には必ずインスタンスが入ってる。
session[:user_id] にidが保存され、current_user メソッドがそれを探すから。

!!current_user とは、 current_user に何も入ってないときは nilを返す。
!nil = true
!true = false
つまり current_user に何も入ってないときは、 !!current_userfalse を返す。