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.
error
undefined method `id' for nil:NilClass
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
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
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
ruby:_follow_form.html.haml
- unless current_user?(@user)
#follow_form
- if current_user.following?(@user)
= render 'unfollow'
- else
= render 'follow'
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
-Ü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).
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? ?? ??
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.
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