ログアウトする方法

sessionはステートフルにするためのもの。ログイン、ログアウトの概念に縛られてはいけない。

user_idをハッシュ化しているものを保存している

# ログアウトをする方法を調べた。
>```rb
>session[:user_id] = nil
>```
https://qiita.com/you8/items/cedbb28aee17e409dc69#%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88%E6%A9%9F%E8%83%BD:~:text=session%5B%3Auser_id%5D%20%3D%20nil

* セッションをnilにする
* よく見る方法だ
* sqlで削除できるから行が空になる、行を空のままにしていいのだろうか？
>```rb
>   def destroy
>     session.delete(:login_id)
>   end
>```
https://sado-tech.hateblo.jp/entry/2018/08/03/121033#:~:text=def%20destroy%0A%20%20%20%20%20session.delete(%3Alogin_id)%0A%20%20%20end

* 削除する方法

https://yachibit.hateblo.jp/entry/2014/01/30/013408#:~:text=%23%20%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%0Asession.delete(%3Ahoge)

#### deleteとは？
>Deletes the row with a primary key matching the id argument, using a SQL DELETE statement, and returns the number of rows deleted. Active Record objects are not instantiated, so the object's callbacks are not executed, including any :dependent association options or Observer methods.
>
>You can delete multiple rows at once by passing an Array of ids.
>
>Note: Although it is often much faster than the alternative, #destroy, skipping callbacks might bypass business logic in your application that ensures referential integrity or performs other essential jobs.

https://api.rubyonrails.org/v3.2/classes/ActiveRecord/Relation.html#method-i-delete:~:text=Deletes%20the%20row,other%20essential%20jobs.

* SQLのdelete句を使ってid引数とマッチしている主キーの行を削除する、そして削除された行の数を返す
* sessionはsqlで削除することができる

# delete_sessionは違いそう
```rb
      # File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 70
    def delete_session(req, session_id, options)
      new_sid = generate_sid unless options[:drop]
      # Reset hash and Assign the new session id
      req.set_header("action_dispatch.request.unsigned_session_cookie", new_sid ? { "session_id" => new_sid.public_id } : {})
      new_sid
    end
```
https://github.com/rails/rails/blob/7750d64a65e5b2641d87ef45e6e65ace193d9a27/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb

https://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html#method-i-delete_session:~:text=delete_session(req%2C%20session_id%2C%20options)

* `options[:drop]`の意味が理解できなかった。
* `options[:drop]`でなければ、新しいセッションIDを生成し、その新たなセッションIDをセットする
* `options[:drop]`であれば、新しくセッションは作成されない。

https://api.rubyonrails.org/v6.0.2.1/classes/ActionDispatch/Session/AbstractSecureStore.html#method-i-generate_sid:~:text=Instance%20Public%20methods-,generate_sid(),-Link

### `set_header("action_dispatch.request.unsigned_session_cookie", new_sid ? { "session_id" => new_sid.public_id } : {})`とは何を表しているのか？
#### set_header()とは？
>```rb
>  # The headers for the response.
>    #
>    #     header["Content-Type"] # => "text/plain"
>    #     header["Content-Type"] = "application/json"
>    #     header["Content-Type"] # => "application/json"
> ...
>  @headers = Headers.new
> ...
>  def set_header(key, v); @headers[key] = v;   end
>```
https://github.com/rails/rails/blob/d0dcb8fa6073a0c4d42600c15e82e3bb386b27d3/actionpack/lib/action_dispatch/http/response.rb#L194

https://github.com/rails/rails/blob/d0dcb8fa6073a0c4d42600c15e82e3bb386b27d3/actionpack/lib/action_dispatch/http/headers.rb#L28

* headerはクラスだった。
* `header["Content-Type"] = "application/json"`をするとヘッダーに値を代入できる

>X-Robots-Tag HTTP ヘッダーにnoindexを付与する
Ruby on Railsを使っている時に、metaタグに記載するのではなく、レスポンスに直接noindexを付与したいケースもあると思います。 そんなときは以下のドキュメントにまずは目を通して、以下の実装をしましょう。
>```rb
>response.set_header('X-Robots-Tag', 'noindex')
>```

https://sakurawi.hateblo.jp/entry/http-header#:~:text=X%2DRobots%2DTag,noindex%27)

* やっている人がいた。

#### "action_dispatch.request.unsigned_session_cookie"というヘッダーは何を表すのか？
* どのような値を格納しているのかわからなかった。
* `Reset hash and Assign the new session id`と書いてあるのでセッションIDを格納する

# 感想
* delete_sessionは方法から除外しようかな
* sessionはuser_id以外にも格納できる。しかしあまり多くのものを格納してはいけない

>```rb
>    def reset_session
>      session.destroy
>      reset_csrf_token
>    end
>```
https://github.com/rails/rails/blob/d0dcb8fa6073a0c4d42600c15e82e3bb386b27d3/actionpack/lib/action_dispatch/http/request.rb#L373

* destroyは関連するもの全て削除する