ユーザーのログアウトのエラーを解決したい
今まで正常にログアウトをすることができていたのですが、突然ログアウトができずエラーが起きてしまうので、解決に至るヒントは原因などをご教授願えますでしょうか。
考えられる原因としては、ユーザーのプロフィールページを作成するためにアイコン画像、プロフィールのカラムを作成後に生じたのでこの部分に関連しているのではと考えております。
avatar
でアイコン画像を作成できるようにしたのですが、この部分がエラーと密接に関係している可能性が高い。
ログアウトはdeviseを使用した機能になっております。また、ログアウトを何も投稿していない時にすると正常にログアウトできるのですが、投稿後にログアウトをするとエラーが起きる
状況です。
発生している問題・エラーメッセージ
NoMethodError in Uploads#index Showing /Users/fujimotoyuunosuke/RubymineProjects/locat/app/views/uploads/index.html.erb where line #117 raised: undefined method `id' for nil:NilClass Extracted source (around line #117): 115 116 117 118 119 120 </div> <p class="upload-user"> <%= link_to image_tag(upload.user.avatar, class: "avatar-img"), user_path(current_user.id) %>⇦この部分 <%= link_to upload.user.name, user_path(current_user.id), class: "upload-user__name" %> </p> </div> Extracted source (around line #98): 96 97 98 99 100 101 <% @uploads.each do |upload| %> <div class="content-page"> <%= link_to upload_path(upload.id), class: "upload-link", method: :get do %>⇦この部分 <div class="upload-contents-wrapper"> <div class="upload-img-contents"> <%= image_tag upload.image, class: "upload-img" if upload.image.attached? %> Extracted source (around line #96): 94 95 96 97 98 99 </div> <div id="content-table"> <% @uploads.each do |upload| %>⇦この部分 <div class="content-page"> <%= link_to upload_path(upload.id), class: "upload-link", method: :get do %> <div
該当のソースコード
app/views/uploads/index.html.erb
erb
1<div id="content-table"> 2 <% @uploads.each do |upload| %> 3 <div class="content-page"> 4 <%= link_to upload_path(upload.id), class: "upload-link", method: :get do %> 5 <div class="upload-contents-wrapper"> 6 <div class="upload-img-contents"> 7 <%= image_tag upload.image, class: "upload-img" if upload.image.attached? %> 8 </div> 9 <div class="upload-contents-detail"> 10 <div class="upload-name"><%= upload.title %></div> 11 <div class="tag-container"> 12 <% upload.tags.each do |tag| %> 13 <div class="upload-tags"> 14 #<%= tag.name %> 15 </div> 16 <% end %> 17 </div> 18 </div> 19 <div class="upload-contents-explain"> 20 <div class="upload-explain"><%= upload.text %></div> 21 </div> 22 <p class="upload-user"> 23 <%= link_to image_tag(upload.user.avatar, class: "avatar-img"), user_path(current_user.id) %> 24 <%= link_to upload.user.name, user_path(current_user.id), class: "upload-user__name" %> 25 </p> 26 </div> 27 <% end %> 28 </div> 29 <% end %> 30 </div>
app/controllers/users_controller.rb
controller
1class UsersController < ApplicationController 2 def show 3 @users = User.find(params[:id]) 4 end 5end 6
app/controllers/uploads_controller.er
controller
1class UploadsController < ApplicationController 2 before_action :authenticate_user!, except: [:index, :show] 3 before_action :set_upload, only: [:show, :edit, :update, :destroy] 4 5 6 def index 7 @uploads = Upload.all.order(created_at: :desc) 8 @tag_list = Tag.all 9 end 10 11 def new 12 @upload_form = UploadForm.new 13 end 14 15 def create 16 @upload_form = UploadForm.new(upload_params) 17 tag_list = params[:upload][:name].split(",") 18 if @upload_form.valid? 19 @upload_form.save(tag_list) 20 redirect_to root_path 21 else 22 render :new 23 end 24 end 25 26 def show 27 @tag = @upload.tags 28 end 29 30 def edit 31 @upload_form = UploadForm.new(upload: @upload) 32 if current_user.id != @upload.user.id 33 redirect_to root_path 34 end 35 end 36 37 def update 38 @upload_form = UploadForm.new(upload_params, upload: @upload) 39 tag_list = params[:upload][:name].split(",") 40 if @upload_form.valid? 41 @upload_form.save(tag_list) 42 redirect_to upload_path(@upload.id) 43 else 44 render :edit 45 end 46 end 47 48 def destroy 49 @upload.image.purge if @upload.image.attached? 50 if current_user.id == @upload.user.id 51 @upload.destroy 52 redirect_to root_path 53 else 54 render :show 55 end 56 57 end 58 59 private 60 61 def upload_params 62 params.require(:upload).permit(:title, :text, :url, :working_day, :day_off, :cafe_wifi_id, :cafe_charging_id, :cafe_smoking_id, :image, :name).merge(user_id: current_user.id) 63 end 64 65 def set_upload 66 @upload = Upload.find(params[:id]) 67 end 68end 69
app/views/shared/_header.html.erb
<header class="header"> <div id="container"> <% if user_signed_in? %> <%= link_to image_tag("home.png", class: 'home-icon'), user_path(current_user.id) %> <% end %> <%= link_to 'locat', root_path, class: "title" %> <button class="menu-btn"> <span></span> <span></span> <span></span> </button> </div> <div class="menu"> <ul class="menu__list"> <% if user_signed_in? %> <li class="menu__name"><%= link_to '登録者情報', "#", class: "menu__link" %></li> <li class="menu__name"><%= link_to 'お気に入りカフェ', "#", class: "menu__link" %></li> <li class="menu__name"><%= link_to 'フォローユーザー', "#", class: "menu__link" %></li> <li class="menu__name"><%= link_to 'locatについて', "#", class: "menu__link" %></li> <li class="menu__name"><%= link_to 'マイページへ', "#", class: "menu__link" %></li> <li class="menu__name"><%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "menu__link" %></li> <% else %> <li class="menu__name"><%= link_to 'ログイン', new_user_session_path, class: "menu__link" %></li> <li class="menu__name"><%= link_to 'ゲストログイン', "#", class: "menu__link" %></li> <li class="menu__name"><%= link_to '新規登録', new_user_registration_path, class: "menu__link" %></li> <% end %> </ul> </div> </header>
app/config/routes.rb
config
1Rails.application.routes.draw do 2 devise_for :users 3 get 'uploads/index' 4 root to: "uploads#index" 5 resources :uploads 6 resources :users, only: :show 7end 8
試したこと
・エラー内容にはindex.html.erb
に問題があると記述されておりますが、今まではログアウトは出来ていたので、この部分のコードを修正するのではなく、別のファイルに修正を加える必要がると考えております。
・修正箇所としては、users_cotroller
だと考えておりますが、この部分には詳細ページ、編集、更新機能などを記述していくので、どの部分に問題があるのか原因が掴めない状況です。
・ログアウトの挙動を調べましたが、投稿をしていない場合ではログアウトができますが、投稿後にログアウトをするとエラーが起きる
ことがわかりました。
・検証としては、current_userが空
となっているために、ログアウトしようとするとログインユーザーを見つけることができないために起きるエラーと考えました。
##エラーメッセージの値の確認
>> @uploads => #<ActiveRecord::Relation [#<Upload id: 1, title: "testcafe", text: "カフェの説明", url: "", working_day: "", day_off: "", cafe_wifi_id: 1, cafe_charging_id: 1, cafe_smoking_id: 1, user_id: 1, created_at: "2021-05-20 16:14:11.950862000 +0000", updated_at: "2021-05-20 16:14:11.997068000 +0000">]> >> upload.id => 1 >> upload => #<Upload id: 1, title: "testcafe", text: "カフェの説明", url: "", working_day: "", day_off: "", cafe_wifi_id: 1, cafe_charging_id: 1, cafe_smoking_id: 1, user_id: 1, created_at: "2021-05-20 16:14:11.950862000 +0000", updated_at: "2021-05-20 16:14:11.997068000 +0000"> >> current_user => nil >> current_user.id NoMethodError: undefined method `id' for nil:NilClass from (eval):1:in `block in _app_views_uploads_index_html_erb___1943206866683830353_21680'
補足情報(FW/ツールのバージョンなど)
開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)
回答1件
あなたの回答
tips
プレビュー