ログアウト機能を作成する
ログインするときにsession[:user_id]
に代入していたから。
これからidを空にすればいいのかな?
nil
にしていたことを思い出した。
ログアウトのリンクを作成
.
.
.
<li>
<%= link_to("ログアウト", "/logout") %>
</li>
.
.
.
ルーティングを設定
.
.
.
get "logout" => "users#logout"
.
.
.
サーバーのレスポンスのアクションを設定
class UsersController < ApplicationController
.
.
.
def logout
@session[:user_id] = nil
flash[:notice] = "ログアウトしました"
redirect_to("/login")
end
.
.
.
end
これをすれば良かったかな?
試してみる
NoMethodError in UsersController#logout
undefined method `[]=' for nil:NilClass
def logout
@session[:user_id] = nil # <---error
flash[:notice] = "ログアウトしました"
redirect_to("/login")
end
@session[:user_id] = nil
の部分がダメみたい。
解決
@
がついていた。
ログイン中とログアウト中の場合にヘッダーの違いを出せ。
ログイン中
・投稿一覧(/posts/index)
・新規投稿(/posts/new)
・ユーザー一覧(/users/index)
・ログアウト(/logout)
ログアウト中
・TweetAppとは(/about)
・新規登録(/signup)
・ログイン(/login)
ログインの状態を表すものはsession[user_id]
だ。
これを使って表していこう。
application.html.erbに条件をつける
.
.
.
<ul class="header-menus">
<% if session[:user_id] %>
<li>
現在ログインしているユーザーのid:
<%= session[:user_id] %>
</li>
<li>
<%= link_to("投稿一覧", "/posts/index") %>
</li>
<li>
<%= link_to("新規投稿", "/posts/new") %>
</li>
<li>
<%= link_to("ユーザー一覧", "/users/index") %>
</li>
<li>
<%= link_to("ログアウト", "/logout") %>
</li>
<% else %>
<li>
<%= link_to("TweetAppとは", "/about") %>
</li>
<li>
<%= link_to("新規登録", "/signup") %>
</li>
<li>
<%= link_to("ログイン", "/login") %>
</li>
<% end %>
</ul>
.
.
.
前の問題の条件をつなげるだけだった。
これでどうだろうか?
「localhost:3000/logout」に対するルーティングがありません
どういうことだろうか?
ログアウトに対するルーティングが設定されていない。
getではなくpostだろうか?
post "logout" => "users#logout"
ログアウト用のリンクのmethodがpostに設定されていません。
リンクをポストにしなければならないのかな?
どのようにすればいいか忘れた。
調べる。
<%= link_to("ログアウト", "/logout", {method: "post"}) %>
にするらしい。
なるほど
get
はページを表示させるためのメソッドだから
post
を使うのかな。
そして
link_to
に{method: "post"}をつけることによってpost
のメソッドになるのか。