[Ruby on Rails] Folgen Sie der undefinierten Methode `id'for nil: Beheben Sie den Fehler NilClass

スクリーンショット 2020-06-20 06.55.37.png

Prämisse / Was Sie erreichen wollen

Ich möchte eine Follow-Funktion implementieren. ruby 2.5.1p57 Rails 5.2.4.2

Die folgende Fehlermeldung ist beim Implementieren der Follow-Funktion aufgetreten.

Probleme / Fehlermeldungen, die auftreten

error


undefined method `id' for nil:NilClass

Entsprechender Quellcode

Tabelle (Migrationsdatei)

Beziehungstabelle


class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.integer :follower_id, foreign_key: true
      t.integer :following_id, foreign_key: true

      t.timestamps null: false
    end

    add_index :relationships, :follower_id
    add_index :relationships, :following_id
    add_index :relationships, [:follower_id, :following_id], unique: true
  end
end

Modell-

relationship.rb


class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :following, class_name: "User"
  validates :follower_id, presence: true
  validates :following_id, presence: true
end

user.rb


class User < ApplicationRecord
  devise  :database_authenticatable, :registerable,
          :recoverable, :rememberable, :validatable
  has_many :posts, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_posts, through: :likes, source: :post
  has_many :comments
  
  def already_liked?(post)
    self.likes.exists?(post_id: post.id)
  end

  has_many :following_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy
  has_many :followings, through: :following_relationships, source: :following
  has_many :follower_relationships, class_name: "Relationship", foreign_key: "following_id", dependent: :destroy
  has_many :followers, through: :follower_relationships, source: :follower

  def following?(user)
    following_relationships.find_by(following_id: user.id)
  end

  def follow!(other_user)
    following_relationships.create!(following_id: user.id)
  end

  def unfollow!(other_user)
    following_relationships.find_by(following_id: user.id).destroy
  end
  
end

Routing

routes.rb


Rails.application.routes.draw do
  devise_for :users
  root to: "posts#index"

  resources :posts do
    resources :comments, only: :create
    resources :likes, only: [:create, :destroy]
  end

  resources :users do
    member do
      get :following, :followers
    end
  end

  resources :relationships, only: [:create, :destroy]
end

Aussicht

ruby:_follow_form.html.haml


- unless current_user?(@user)
  #follow_form
  - if current_user.following?(@user)
    = render 'unfollow'
  - else
    = render 'follow'

Regler

users_controller.rb


class UsersController < ApplicationController

  def show
    
  end
  
  def edit
    
  end

  def update
    if current_user.update(user_params)
      redirect_to root_path
    else
      render :edit
    end
  end

  def following
    @user = User.find(id: params[:id])
    binding.pry
    @users = @user.followings
    render 'show_following'
  end

  def followers
    @user = User.find(id: params[:id])
    binding.pry
    @users = @user.followers
    render 'show_follower'
  end

  private

  def user_params
    params.require(:user).permit(:id, :name, :email)
  end

end

Was ich versucht habe

-Überprüft, ob die Zuordnung von user.rb (Benutzermodell) korrekt eingerichtet wurde. -Überprüft auf Rechtschreibfehler in user.rb (Benutzermodell) und _follow_form.html.haml (Teilvorlage).

Bedeutung der Fehlermeldung

error


following_relationships.find_by(following_id: user.id)

undefined method `id' for nil:NilClass

-Ich habe versucht, die ID-Methode für nil aufzurufen, aber ich konnte sie nicht finden. ・ Benutzer ist Null

→ Was bewirkt, dass der Benutzer Null wird? ?? ??

Fehlerursache und -lösung gefunden

Wird durch Definieren von @user wie folgt in der show-Aktion von users_controller.rb gelöst.

users_controller.rb


def show
  @user = User.find(params[:id])
end

Mit params [: id] wird der mit dem Pfad gesendete Wert vor dem Übergang vom Bildschirm empfangen.

Dank dieses Artikels konnte ich den Fehler beheben

Ich fand es auf einer Seite namens Teratail, der Yahoo-Weisheitstasche eines Ingenieurs. [Ruby on Rails] Folgen Sie der Funktion undefinierte Methode `id'for nil: NilClass-Fehlermeldung wird angezeigt

Recommended Posts

[Ruby on Rails] Folgen Sie der undefinierten Methode `id'for nil: Beheben Sie den Fehler NilClass
[Ruby on Rails] undefinierte Methode `id'for nil: NilClass-Fehlerbehebungsmethode
[Ruby on Rails] Kein Methodenfehler undefinierte Methode `devise_for'error Auflösung
[Ruby on Rails] undefinierte Methode `id'for nil: NilClass-Fehlerbehebungsmethode
Spring Boot + PostgreSQL-Fehlerbehebungsmethode
[Ruby on Rails] Folgen Sie der undefinierten Methode `id'for nil: Beheben Sie den Fehler NilClass
[Ruby on Rails] Kein Methodenfehler undefinierte Methode `devise_for'error Auflösung
[Ruby on Rails] Folgen Sie der Funktionsimplementierung: Bidirektional
[Ruby on Rails] Suchfunktion (Modell, Methodenauswahlformel)
[Ruby on Rails] Paging-Funktion eingeführt
[Ruby on Rails] CSV-Ausgabefunktion
[Ruby on Rails] Implementierung der Kommentarfunktion
[Ruby on Rails] DM, Chat-Funktion
[Ruby on Rails] Implementierung einer ähnlichen Funktion
[Ruby on Rails] Logisches Löschen (Auszahlungsfunktion)
[Ruby on Rails] Kein Methodenfehler: undefinierte Methode `t'for # <ActiveRecord :: Migration: 〇〇〇〇> Umgang mit Fehlern
Validierungseinstellungen für die Ruby on Rails-Anmeldefunktion
Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
Schienen folgen der Funktion
Ruby on Rails Implementierung der automatischen Mail-Sendefunktion
Ruby on Rails So implementieren Sie die automatische Adresseneingabe
[Ruby on Rails] Nachbearbeitungsfunktion (Aktualisieren, Löschen)
[Ruby on Rails] Individuelle Anzeige von Fehlermeldungen
[Ruby on Rails] Asynchrone Kommunikation der Posting-Funktion, Ajax
Zusammenfassung der Methoden zum Aktualisieren mehrerer Spalten [Ruby on Rails]
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
Ruby on Rails Elementary
Ruby on Rails Grundlagen
Ruby On Rails Association
Fehlerbehebung bei Heroku
Ruby on Rails Einstellung der automatischen E-Mail-Sendefunktion (über Google Mail)
Ruby on Rails-Datensatzsuche, erstellen Sie die Methode find_or_create_by, wenn nicht
Ein Hinweis zum Seed-Feature von Ruby on Rails
[Ruby on Rails] Implementieren Sie die Anmeldefunktion von add_token_to_users mit API
Bei Verwendung von Slim mit Ruby on Rails wird in form_with "undefinierte lokale Variable oder Methode` f'for" angezeigt
Ruby on Rails Lernrekord -2020.10.03
Portfolioerstellung Ruby on Rails
Ruby on Rails Lernrekord -2020.10.04
Ruby on Rails Lernrekord -2020.10.09
Ruby on Rails lernen Rekord-2020.10.07 ②
Ruby on Rails lernen Rekord-2020.10.07 ①
Brechen Sie die Ruby on Rails-Migration ab
[Ruby] Hinweise zur Methode gets
Ruby on Rails Lernrekord -2020.10.06
Zusammenfassung der Ruby on Rails-Validierung
Ruby on Rails Grundlegendes Memorandum
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
[Ruby on Rails] Posting-Funktion, die nur angemeldete Benutzer posten können