Rails チュートリアル8章

8.1セッションとは

HTTPはステートレスなプロトコル。独立したトランザクションとも言える
Railsでセッションを実装する方法はcookies
cookiesとはユーザーのブラウザに保存される小さなデータ

8.1.1セッションコントローラー
セッションコントローラーの作成

rails generate controller Sessions new

ルーティングの設定

root "static_pages#home"
get "./help," to "staitc#helps"
 get    '/about',   to: 'static_pages#about'
 get    '/contact', to: 'static_pages#contact'
 get    '/signup',  to: 'users#new'
 get    '/login',   to: 'sessions#new'
 post   '/login',   to: 'sessions#create'
 delete '/logout',  to: 'sessions#destroy'
 resources :users
end

ログインフォーム
ログインフォームはユーザーフォームと同じ
EmailとPasswordだけ使う
間違いはフラッシュで教える
セッションはAciteve Recordではないから自動でエラーメッセージを教えてくれない

<% provide(:title, 'Log in') %>
<h1>ログイン</h1>
<div class="row"></div>
 <div class="col-md-6 col-md-offset-3">
   <!-- formの送信先を指定 -->
   <%= form_for :session, url: login_path do |f| %>      <!-- 送信先をurlが/login、Sessionsコントローラのcreateアクションに@userを送り、fブロックに代入-->
   <!-- form作成-->
     <%= f.label :email %>
     <%= f.email_field :email, class: 'form-control' %>
     <%= f.label :password %>
     <%= f.password_field :password, class: 'form-control' %>
   <!-- 送信ボタン-->
     <%= f.submit "送信", class: "btn btn-primary" %>
   <% end %>
   <!-- 登録ページへのボタン -->
   <p>New user? <%= link_to "Sign up now!", signup_path %></p>
 </div>
</div>

ユーザーけんさくと認証
ログインでセッションを作成する場合
1入力が無効な処理
2ログイン失敗時のエラーメッセージ
3ログイン成功時のど台作成

Sessionsコントローラーのcreateアクションにnewビューが出力する

フラッシュメッセージを作成
ログイン失敗メッセージ

def create
   user = User.find_by(email: params[:session][:email].downcase)               # paramsハッシュで受け取ったemail値を小文字化し、email属性に渡してUserモデルから同じemailの値のUserを探して、user変数に代入
   if user && user.authenticate(params[:session][:password])                   # user変数がデータベースに存在し、なおかつparamsハッシュで受け取ったpassword値と、userのemail値が同じ(パスワードとメールアドレスが同じ値であれば)true
   else
     flash.now[:danger] = "Invalid email/password combination"                 # flashメッセージを表示し、新しいリクエストが発生した時に消す
     render 'new'                                                              # newビューの出力
   end
 end

8.2ログイン
Railsの親クラスにモジュールを読み込ませる

class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception
 include SessionsHelper                                                         #SessionsHelper (メソッドの集合体)を全コントローラに適用

 def home
   render html: "こんにちは世界"
 end
end

8.2.1 log_inメソッド
定義済みのSession メソッドでログイン出来るようにする

session[:user_id] = user.id

log_inをcreatアクションの中身を完成させる

 def create
   user = User.find_by(email: params[:session][:email].downcase)               # paramsハッシュで受け取ったemail値を小文字化し、email属性に渡してUserモデルから同じemailの値のUserを探して、user変数に代入
   if user && user.authenticate(params[:session][:password])                   # user変数がデータベースに存在し、なおかつparamsハッシュで受け取ったpassword値と、userのemail値が同じ(パスワードとメールアドレスが同じ値であれば)true
     log_in user                                                               # sessions_helperのlog_inメソッドを実行し、sessionメソッドのuser_id(ブラウザに一時cookiesとして保存)にidを送る
     redirect_to user                                                          # ログインしたユーザーのページにリダイレクト
   else
     flash.now[:danger] = 'Invalid email/password combination'                 # flashメッセージを表示し、新しいリクエストが発生した時に消す
     render 'new'                                                              # newビューの出力
   end
 end

現在のユーザー
current_userメソッドを定義しセッションIDに対するユーザー名をDBから出す
現在名を表示

if @current_user.nil?
@current_user = User.find_by(id: session[:user_id])
else
@current_user
end

ユーザー登録時にログイン
ユーザーアカウントの新規作成後直接自動でログインされる仕組み

def create
   @user = User.new(user_params)                                               # newビューにて送ったformの中身(nameやemailの値)をuser_paramsで受け取り、ユーザーオブジェクトを生成、@userに代入
   if @user.save
     log_in @user                                                              # log_inメソッド(ログイン)の引数として@user(ユーザーオブジェクト)を渡す。要はセッションに渡すってこと
     flash[:success] = "ようこそYUUKIのサイトへ"                                    # flashの:successシンボルに成功時のメッセージを代入
     redirect_to @user                                                         #(user_url(@user) つまり/users/idへ飛ばす(https://qiita.com/Kawanji01/items/96fff507ed2f75403ecb)を参考
   else
     render 'new'
   end
 end
 
 

ログアウト

ログアウト機能は、既にリンクは作ってあるので、ユーザーセッションを破棄するための有効なアクションをコントローラで作成するだけで済む。

これまでsessionsコントローラのアクションはRESTfulルールに従っており、例えばnewでログインページを表示し、createでログイン完了、といった具合で行っていた。

セッションを破棄する際もdestroyアクションを使えばいいのだが、ログインの場合とは異なり、
ログアウト処理は一ヶ所で行える

具体的には、log_inメソッドの実行結果を取り消して、セッションからユーザーIDを削除するだけ。




この記事が気に入ったらサポートをしてみませんか?