yuufuji0000
@yuufuji0000 (yuu)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

突然ログアウトができなくなった原因を解決したい

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

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

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

また、ログアウト時にエラーが生じますが、ログアウト以外のページに遷移することもできなくなる。

ログアウトは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

Your answer might help someone💌