Je souhaite implémenter une fonction de suivi. ruby 2.5.1p57 Rails 5.2.4.2
Le message d'erreur suivant s'est produit lors de l'implémentation de la fonction de suivi.
error
undefined method `id' for nil:NilClass
table de relations
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
-Vérifié si l'association de user.rb (modèle utilisateur) a été configurée correctement. -Vérifié partout pour les fautes d'orthographe dans user.rb (modèle utilisateur) et _follow_form.html.haml (modèle partiel).
error
following_relationships.find_by(following_id: user.id)
undefined method `id' for nil:NilClass
-J'ai essayé d'appeler la méthode id pour nil, mais je ne l'ai pas trouvée. ・ L'utilisateur est nul
→ Qu'est-ce qui fait que l'utilisateur devient nul? ?? ??
NoMethodError in Users # show
, donc je devrais me méfier de l'action show dans users_controller.rb.Je l'ai résolu en définissant @user comme suit dans l'action show de users_controller.rb.
users_controller.rb
def show
@user = User.find(params[:id])
end
Avec params [: id]
, la valeur envoyée avec le chemin est reçue de l'écran avant la transition.
Je l'ai trouvé sur un site appelé teratail, le sac de sagesse yahoo d'un ingénieur. [Ruby on Rails] Suivez la méthode indéfinie de la fonction ʻid'for nil: le message d'erreur NilClass apparaît
Recommended Posts