0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

progate 整理 メモ

Posted at

ログアウト機能を作成する

ログインするときにsession[:user_id]に代入していたから。
これからidを空にすればいいのかな?
nilにしていたことを思い出した。

ログアウトのリンクを作成

application.html
.
.
.
        <li>
          <%= link_to("ログアウト", "/logout") %>
        </li>
.
.
.

ルーティングを設定

 routes.rb
.
.
.
get "logout" => "users#logout"
.
.
.

サーバーのレスポンスのアクションを設定

users_controller.rb
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

users_controller.rb
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のメソッドになるのか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?