Rails セッション(session)の概要と使い方！！！

#はじめに
先日アプリケーション開発のユーザー登録機能を実装していた際、
セッション(session)を用いてページの変遷を行ったので、備忘録としてここに記します。
:dancers::dancers:
#セッション(session)とは？
###セッション
**セッションとはユーザーがWebサイトを表示して、離脱するまでの一連の流れを意味します。**
簡単にいうとシステム上でユーザーのデータを保持することです。
例えば、一度ログインしたアプリに毎回ログインしなくても勝手にマイページが表示されていることはありませんか？
それがセッションです。
###ステートレス
現在のweb通信は基本的にステートレスな通信になっています。
**ステートレス**というのはセッション情報を保持しないこと。対義語は**ステートフル**です。
簡単に言うと通信１回１回が独立していて、「何にも覚えていませんよ〜」ってことです。

ステートレスな通信の１番良いところは、システムへの負荷が少ないと言うことです。

ステートフルな通信は以下のようになります。

*Aさん『名前はAです。年齢は２３歳です。』
システム『名前はAね。歳は２３ね。』
Aさん『住所は東京都＊＊＊区です。』
システム『名前はAね。歳は２３ね。住所は東京都＊＊＊区ね。』
Aさん『机とパソコンを買いたい。』
システム『名前はAね。歳は２３ね。住所は東京都＊＊＊区ね。机とパソコンを買いたいのね。』
Aさん『やっぱり、ボールペンも買いたい。』
システム『名前はAね。歳は２３ね。住所は東京都＊＊＊区ね。机とパソコンを買いたいのね。ボールペンも追加と。』
……*

一見何の問題もなさそうに見えますが、
あなたがシステム側だったらめちゃめちゃ大変だと思いませんか。
僕だったら頭爆発しますね。ただでさえ記憶力悪いのに…。

このステートフルな通信をを全てのページでやってたらやばいので、
**「基本はステートレスな通信にして、必要なとこだけステートフルな通信にしよう」**
ここで使うのが**セッション**です！！！

#deviseとセッション
今回は、サインアップ時に『step1,step2,step3…』みたいな感じでページを変遷するサインアップ画面を作っていきましょう。
イメージはこんな感じです。

###View

**step1(１ページ目)**
![スクリーンショット 2019-09-30 15.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/b1f3bd46-ae86-d457-e374-76c901f394e2.png)

**step2(２ページ目)**
![スクリーンショット 2019-09-30 15.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/94558c04-ceab-e11e-b0ef-8f47255e6051.png)

###controller

```registrations_controller.rb
def step1
    @user = User.new
end

def step2
    session[:nickname] = params[:user][:nickname]
    session[:email] = params[:user][:email]
    session[:password] = params[:user][:password]
    session[:password_confirmation] = params[:user][:password_confirmation]
    session[:f_name_kana] = params[:user][:f_name_kana]
    session[:l_name_kana] = params[:user][:l_name_kana]
    session[:f_name_kanji] = params[:user][:f_name_kanji]
    session[:l_name_kanji] = params[:user][:l_name_kanji]
    session[:birthday] = birthday_join
end


def create
   
@user = User.create(nickname:session[:nickname], email: session[:email], password: session[:password], password_confirmation: session[:password_confirmation], f_name_kana: session[:f_name_kana],l_name_kana: session[:l_name_kana], f_name_kanji: session[:f_name_kanji], l_name_kanji: session[:l_name_kanji], birthday: session[:birthday], tel: params[:user][:tel])


    if @user.save
      redirect_to controller: '/addresses', action: 'step3'
      bypass_sign_in(@user)
    else
      redirect_to signup_index_path, notice: '初めから入れ直してください'
      
    end
  end
```
###解説

①step1で必要な情報を入力してもらう。formタグ or form_with等を使えばOK。情報の送り先はstep2、メソッドはgetで！！
②step2で入力した値を取り出す。
paramsで入力した値を取り出し、その値をsessionに入れる。
③step2で電話番号を入力してもらう。情報の送り先はcreate,メソッドはpostで！！
④最後にcreateアクションでユーザーを生成するだけ。
この時の値はsessionで保存されています！！

step1からstep2でこんなポップアップが出るはず（PC環境によってはでないかも？）
![スクリーンショット 2019-09-30 16.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/f84f6c78-df2e-d4c4-3a09-d81df278f2b4.png)

この手順を繰り返していけばどれだけページ変遷をしても情報を持っていけます！！
今回はparamsで値を取り出しましたが、どんな形でもOKです。session[:＊＊＊＊＊＊＊]に入れておけば情報の保持ができますよ。


#おわりに
今回はサインアップ時にセッションを活用しましたが、どんなときでも使用できるので、かなり汎用性が高いです。
セッションをマスターできればできることも広がります:nerd::nerd:
記事を書くモチベーションになるので、もし参考になったらいいねお願いします:thumbsup_tone1::thumbsup_tone1:

参考記事
https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6