ヘッダーのログアウトのリンクを押してもログアウトリンクに遷移しない原因

初めに

  • Progateを学習して躓いたところのアウトプットをすることで学習効率を上げる目的とともに備忘録として記事を書きます

問題

  • ヘッダーのログアウトのリンクを押してもログアウトリンクに遷移しない

考えられること

  • ログアウトリンクに誤りがある

  • ログアウトに関するルーティングに誤りがある

  • user_controllerのlogoutアクションに誤りがある

関連するコード

routes.rb
Rails.application.routes.draw do
  post "logout" => "users#logout"
  get "login" => "users#login_form"
  post "login" => "users#login"
  
  post "users/:id/update" => "users#update"
  get "users/:id/edit" => "users#edit"
  post "users/create" => "users#create"
  get "signup" => "users#new"
  get "users/index" => "users#index"
  get "users/:id" => "users#show"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  post "posts/create" => "posts#create"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  
  get "/" => "home#top"
  get "about" => "home#about"
end
users_controller
class UsersController < ApplicationController
  def index
    @users = User.all
  end
  
  def show
    @user = User.find_by(id: params[:id])
  end
  
  def new
    @user = User.new
  end
  
  def create
    @user = User.new(
      name: params[:name],
      email: params[:email],
      image_name:"default_user.jpg",
      password: params[:password]
      )
    if @user.save
     
      session[:user_id] = @user.id
      flash[:notice] = "ユーザー登録が完了しました"
      redirect_to("/users/#{@user.id}")
    else
      @email = params[:email]
      @password = params[:password]
      @name = params[:name]
      render("users/new")
    end
  end
  
  def edit
    @user = User.find_by(id: params[:id])
  end
  
  def update
    @user = User.find_by(id: params[:id])
    @user.name = params[:name]
    @user.email = params[:email]
   if params[:image]
    @user.image_name = "#{@user.id}.jpg"
    image = params[:image]
    File.binwrite("public/user_images/#{@user.image_name}",image.read)
   end
    if @user.save
      flash[:notice] = "ユーザー情報を編集しました"
      redirect_to("/users/#{@user.id}")
    else
      render("users/edit")
    end
  end
  def login_form
  end
  
  def login
    @user = User.find_by(password: params[:password], email: params[:email])
    if @user
     session[:user_id] = @user.id
     flash[:notice] = "ログインしました"
     redirect_to("/posts/index")
    else
      @email = params[:email]
      @password = params[:password]
      @error_message = "メールアドレスまたはパスワードが間違っています"
     render("users/login_form")
    end
  end
  def logout
      session[:user_id] = nil
      flash[:notice] = "ログアウトしました"
      redirect_to("/login")
    
  end
  
end
application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>TweetApp</title>
    <%= csrf_meta_tags %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <header>
      <div class="header-logo">
        <%= link_to("TweetApp", "/") %>
      </div>
      <ul class="header-menus">
   
        <li>
          <% if session[:user_id] %>
          現在ログインしているユーザーのid: 
          <%= session[:user_id] %>
       
          <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%>
        </li>
      </ul>
    </header>

    <% if flash[:notice] %>
      <div class="flash">
        <%= flash[:notice] %>
      </div>
    <% end %>
    
    <%= yield %>
  </body>
</html>

原因

  • ログアウトリンクに{method: "post"}が記述されていなかった。

  • <%= link_to("ログアウト","/logout",{method: "post"})%>

  • {method: "post"}がないことでログアウトに関連するpost "/logout" =>"users#logout"を実行できなかったと考えられる

  • link_toではHTTP methodを指定してあげないとgetになってしまうので get "/logout" =>"user#logout"を探してしまうことになってしまう

結語

  • link_toはmethodを指定しなければHTTPメソッドをgetとしてしまう