質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

3206閲覧

Railsでログアウトができない問題について

suzuryu.07

総合スコア3

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/08/25 11:30

#解決したいこと
Railsでログイン機能を持つTodoアプリを作成しています。
ログアウトを押すと、Routing Errorとなりログアウトが実行出来ません。ログアウトできるように解決したいです。
よろしくお願いします。

#エラー画面
以下のようなエラー画面が表示されました。
イメージ説明

#実行したこと
ルーティングエラーと言うことで、以下を確認しましたが、解決できませんでした。

  • ルーティングの確認
  • .jsファイルの確認

#作成したコード
作成したコードを掲載します。

app/controllers/sessions_controller.rb

ruby

1class SessionsController < ApplicationController 2 #ログインページの表示 3 def new 4 end 5 6 def create 7 #DBからユーザーを取り出す。 8 user = User.find_by(email: params[:session][:email].downcase) 9 if user && user.authenticate(params[:session][:password]) 10 #パスワードが登録されたユーザー情報と一致したら、セッションにユーザー情報を登録する。 11 log_in user 12 redirect_to '/' 13 else 14 flash[:alert] = 'Invalid email/password combination' 15 render 'new' 16 end 17 18 end 19 20 def destroy 21 logout 22 flash[:notice] = "Logged out!" #追加が成功した際に、flashメッセージを表示する。 23 redirect_to '/' 24 end 25end

app/controllers/sessions_helper.rb

ruby

1module SessionsHelper 2 #渡されたユーザーでログインする。 3 #攻撃者がこの情報をcookiesから盗むことができたとしても、本物のユーザーとしてログインすることはできない。 4 def log_in(user) 5 #ユーザーのブラウザ内の一時cookiesに暗号済みのユーザーIDが自動で生成される。 6 #session[:名前]により、名前をつけてセッションに登録できる。 7 session[:user_id] = user.id 8 end 9 10 #セッションに含まれる現在のユーザーを検索する。 11 def current_user 12 if session[:user_id] 13 @current_user ||= User.find_by(id: session[:user_id]) 14 #@current_user = @current_user || User.find_by(id:session[:user_id]) 15 end 16 end 17 18 #ユーザーがログインしていればtrue,そうでなければfalseを返す。 19 def logged_in? 20 #current_user.nil?がfalseの場合(すなわち・・・)にtrueとなる。 21 !current_user.nil? 22 end 23 24 #ログイン中のユーザーをログアウトする. 25 def logout 26 session.delete(:user_id) 27 @current_user = nil 28 end 29end

app/views/layouts/application.html.erb
ヘッダー部分のみ掲載します。

html

1<!--ヘッダー--> 2 <header> 3 <nav class="navbar navbar-expand-lg navbar-light bg-light"> 4 <div class="container-fluid"> 5 <a class="navbar-brand"><%= link_to("Todoアプリ","/")%></a> 6 <div class="collapse navbar-collapse justify-content-end" id="navbarNavAltMarkup"> 7 <div class="navbar-nav"> 8 <% if logged_in? %> 9 <a class="nav-link"><%= link_to "タスク一覧", tasks_path %></a> 10 <a class="nav-link"><%= link_to "ログアウト", logout_path, method: :delete %></a> 11 <a class="nav-link"><%= link_to "ユーザー一覧", users_path %></a> 12 <% else %> 13 <a class="nav-link"><%= link_to "新規登録", new_user_path %></a> 14 <a class="nav-link"><%= link_to "ログイン", login_path %></a> 15 <% end %> 16 </div> 17 </div> 18 </div> 19 </nav> 20 21 </header>

app/javascript/application.js

js

1import Rails from "@rails/ujs" 2import Turbolinks from "turbolinks" 3import * as ActiveStorage from "@rails/activestorage" 4import "channels" 5import 'bootstrap' 6import '../src/application.scss' 7 8//= require rails-ujs 9//= require jquery 10//= require jquery_ujs 11//= require bootstrap 12//= require turbolinks 13//= require_tree . 14 15require("@rails/ujs").start() 16require("turbolinks").start() 17require("@rails/activestorage").start() 18require("channels") 19require("jquery") 20 21Rails.start() 22Turbolinks.start() 23ActiveStorage.start()

config/routes.rb

ruby

1Rails.application.routes.draw do 2 get 'sessions/new' 3 get '/' => "home#top" #トップページのルーティング home:コントローラー名 top:アクション名 4 get 'login' => 'sessions#new' #新しいセッションのページ(ログイン) 5 post 'login' => 'sessions#create' #新しいセッションの作成 6 delete 'logout' => 'sessions#destroy' #セッションの削除(ログアウト) 7 #resourcesメソッドを用いることで、HTTPメソッドとURLとアクションを自動的に紐付ける。 8 #Tasksコントローラーのルーティングが自動生成される。 9 resources :tasks 10 resources :users 11 resources :sessions 12end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

routes.rbのところで、
delete 'logout' => 'sessions#destroy' #セッションの削除(ログアウト)

get 'logout' => 'sessions#destroy' #セッションの削除(ログアウト)
に変更したところ、うまく動作しました。rails routesでルーティングの確認をすると、
logout GET /logout(.:format) sessions#destroy
となっており、HTTP動詞がGETであるので、deleteをgetに変更すると動作しました。

投稿2021/08/26 23:55

suzuryu.07

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

https://teratail.com/questions/291155

https://qiita.com/khksmt1999/items/09015c345d88e47a77bd

同じようなエラーが出ているようなので、一度試してみてください。

投稿2021/08/26 14:31

J_O

総合スコア143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzuryu.07

2021/08/26 23:53

返信ありがとうございます。rails-ujsも動作しており、他の箇所を疑ってみたところ、HTTP動詞がGETになっているのに、ルーティングでdeleteに指定していたことが原因でした。 deleteをgetに変更したところ、うまく動作しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問