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を削除するだけ。
この記事が気に入ったらサポートをしてみませんか?