ヘッダーのログアウトのリンクを押してもログアウトリンクに遷移しない原因
初めに
- 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としてしまう