突然ログアウトができなくなった原因を解決したい
Discussion
ユーザーのログアウトのエラーを解決したい
今まで正常にログアウトをすることができていたのですが、突然ログアウトができずエラーが起きてしまうので、解決に至るヒントは原因などをご教授願えますでしょうか。
考えられる原因としては、ユーザーのプロフィールページを作成するためにアイコン画像、プロフィールのカラムを作成後に生じたのでこの部分に関連しているのではと考えております。
また、ログアウト時にエラーが生じますが、ログアウト以外のページに遷移することもできなくなる。
ログアウトはdeviseを使用した機能になっております。
発生している問題・エラーメッセージ
NoMethodError in Uploads#index
Showing /Users/ooooo/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
<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 class="upload-contents-wrapper">
<div class="upload-img-contents">
<%= image_tag upload.image, class: "upload-img" if upload.image.attached? %>
</div>
<div class="upload-contents-detail">
<div class="upload-name"><%= upload.title %></div>
<div class="tag-container">
<% upload.tags.each do |tag| %>
<div class="upload-tags">
#<%= tag.name %>
</div>
<% end %>
</div>
</div>
<div class="upload-contents-explain">
<div class="upload-explain"><%= upload.text %></div>
</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>
<% end %>
</div>
<% end %>
</div>
app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@users = User.find(params[:id])
end
end
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/controllers/upload_controller.rb
class UploadsController < ApplicationController
before_action :authenticate_user!, except: [:index, :show]
before_action :set_upload, only: [:show, :edit, :update, :destroy]
def index
@uploads = Upload.all.order(created_at: :desc)
@tag_list = Tag.all
end
def new
@upload_form = UploadForm.new
end
def create
@upload_form = UploadForm.new(upload_params)
tag_list = params[:upload][:name].split(",")
if @upload_form.valid?
@upload_form.save(tag_list)
redirect_to root_path
else
render :new
end
end
def show
@tag = @upload.tags
end
def edit
@upload_form = UploadForm.new(upload: @upload)
if current_user.id != @upload.user.id
redirect_to root_path
end
end
def update
@upload_form = UploadForm.new(upload_params, upload: @upload)
tag_list = params[:upload][:name].split(",")
if @upload_form.valid?
@upload_form.save(tag_list)
redirect_to upload_path(@upload.id)
else
render :edit
end
end
def destroy
@upload.image.purge if @upload.image.attached?
if current_user.id == @upload.user.id
@upload.destroy
redirect_to root_path
else
render :show
end
end
private
def upload_params
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)
end
def set_upload
@upload = Upload.find(params[:id])
end
end
試したこと
・エラー内容にはindex.html.erb
に問題があると記述されておりますが、今まではログアウトは出来ていたので、この部分のコードを修正するのではなく、別のファイルに修正を加える必要がると考えております。
・修正箇所としては、users_cotroller
だと考えておりますが、この部分には詳細ページ、編集、更新機能などを記述していくので、どの部分に問題があるのか原因が掴めない状況です。
・エラー文のデバッグでcurren_user.id
がnillと表示されているため、ログアウトする際にログインしているユーザーを発見できないためにログアウトができない。
エラーメッセージ欄で確認した値について
@uploads
=> #<ActiveRecord::Relation [#<Upload id: 1, title: "testcafe1", text: "カフェの説明", url: "", working_day: "", day_off: "", cafe_wifi_id: 1, cafe_charging_id: 2, cafe_smoking_id: 1, user_id: 1, created_at: "2021-05-20 08:44:25.014996000 +0000", updated_at: "2021-05-20 08:44:25.060658000 +0000">]>
upload.id
=> 1
current_user.id
NoMethodError: undefined method `id' for nil:NilClass
from (eval):1:in `block (2 levels) in _app_views_uploads_index_html_erb___3309571774420294849_25060'
補足情報(FW/ツールのバージョンなど)
開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)
0