#解決したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。