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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

1回答

1405閲覧

ユーザーのログアウトをするとエラーが起きる

yuu0000

総合スコア4

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

1グッド

0クリップ

投稿2021/05/20 09:33

編集2021/05/20 16:50

ユーザーのログアウトのエラーを解決したい

今まで正常にログアウトをすることができていたのですが、突然ログアウトができずエラーが起きてしまうので、解決に至るヒントは原因などをご教授願えますでしょうか。

考えられる原因としては、ユーザーのプロフィールページを作成するためにアイコン画像、プロフィールのカラムを作成後に生じたのでこの部分に関連しているのではと考えております。

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)

tomy-c👍を押しています

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

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

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

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

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

asm

2021/05/20 16:35

UploadsController#indexはどうなっていますか?
yuu0000

2021/05/20 16:51

ご連絡ありがとうございます! 投稿内容を編集して、UploadsController#indexまで追加しましたので、ご確認下さいませ。
winterboum

2021/05/20 22:06

logoutしたときどこに行くようにしてありますか? 行き先のcodeは上にありますか?なければ載せてください
yuu0000

2021/05/21 02:33

ログアウト時の遷移などはまだ記述しておりませんでした。 ただ、ログインしていない時は、ログインページに遷移する記述にはしてあります。 before_action :authenticate_user!, except: [:index, :show]
yuu0000

2021/05/21 03:00

改めて確認してみましたが、仮にログアウト後のリダイレクト先を指定した場合でも、ログアウト時にidがnillとなってしまっているためログアウト自体ができない状態でした。、、
guest

回答1

0

ベストアンサー

logoutしたあとどこに飛ぶようにしてあるか、はわかりませんが 直接かその後か エラーの原因は明らかです
<%= link_to image_tag(upload.user.avatar, class: "avatar-img"), user_path(current_user.id)
logout しているので current_user がnilになります。

class UploadsController < ApplicationController before_action :authenticate_user!, except: [:index, :show]
において、indexを除外しているので、、、、

この linkを if current_user で囲みましょう

投稿2021/05/20 22:16

winterboum

総合スコア23284

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

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

yuu0000

2021/05/21 03:51

ありがとうございます! linkをif current_user で囲むとは、 <%= link_to image_tag(upload.user.avatar, class: "avatar-img"), user_path(current_user.id) に囲むのでしょうか? 何度も申し訳ございません、、
winterboum

2021/05/21 03:59

if current_user link_to end
yuu0000

2021/05/21 04:11

ありがとうございます。 下記のように修正してみました。 <% if current_user %> <%= link_to image_tag(upload.user.avatar, class: "avatar-img"), user_path(current_user.id) %> <% end %>
winterboum

2021/05/21 08:05

ああ! そうですね > asm
yuu0000

2021/05/21 13:04

ありがとうございます! link_to_ifを使用して記述する場合は、 <% link_to_if current_user, image_tag(upload.user.avatar, class: "avatar-img"), user_path(current_user.id) %> で記述はお間違いないでしょうか? 記述に誤りがありましたらご指摘頂けたら幸いです、、
winterboum

2021/05/22 08:51

そのclassは imageにつけるの? link につけるの?
yuu0000

2021/05/24 05:40

classはimage_tagにつけております。
winterboum

2021/05/24 06:18

だとよさそうですね
yuu0000

2021/05/24 07:03

下記のように修正したところ、ログアウト後にトップページに戻るようになりました! お忙しいところ誠にありがとうございました。 <% if current_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" %> <% end %>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問