0

Haben Sie eine kurze Frage zur Einrichtung, wie Sie anzeigen, wer das Profil eines Nutzers in meiner App mithilfe von Schienen besucht hat? Ich folgte der akzeptierten Antwort auf diese Frage - How to show who has visited your profile?, stieß aber auf einen Fehler, der mich ein wenig verwirrt hat. Ich habe den Fehler aufgelistet, die ich erhalte und meine entsprechenden Code unter:Wie wird angezeigt, wer das Profil eines Benutzers in Rails besucht hat?

Zwei Fehler in meinem Benutzer-Controller

Error1 erscheinen: nicht definierte Methode visits' for nil:NilClass Error2: can't write unknown attribute visitor_id` >> Immer wenn ich ein Profil des Benutzers besuchen

Benutzer Controller

class UsersController < ApplicationController 
before_action :set_user, only: [:show, :edit, :update, :destroy, :share, :follow] 
before_action :create_visit 

def show 
@user = User.find(params[:id]) 
@visitprofiles = current_user.visitors.where('created_at > ?', 1.month.ago) 
end 
private 

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

def create_visit 
@user.visits.create(visitor: current_user) 
end 

User.rb

class User < ApplicationRecord 
# Include default devise modules. Others available are: 
# :confirmable, :lockable, :timeoutable and :omniauthable 
devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:facebook] 




has_many :visits 
has_many :visitors, through: :visits 

Visit.rb

class Visit < ApplicationRecord 
belongs_to :user 
belongs_to :visitor, class_name: 'User', foreign_key: 'visitor_id' 
end 
+0

sollten Sie wahrscheinlich 'before_action: create_visit, nur: [: show]' verwenden, da sonst die Zahl zu hoch wird. –

Antwort

2

Weil Ihr @user ist nil.

Sie haben before_action :set_user, aber es wird nicht vor create_user aufgerufen. In Ihrem create_user ist Ihr @user nicht festgelegt, daher ist es null

Zwei Edelsteine ​​für das Debuggen

Sie gezeigt werden soll, wenn der Code zu brechen. Better errors und Binding or callers sind zwei Edelsteine, die ich für die schnelle Debugging Rails App nützlich fand.

Ein weiteres Problem mit Ihrem Code

Sie set_user brefore show, und Sie haben genau die gleiche Logik für einen Benutzer in Ihrer show Methode zu suchen. Dies ist nicht trocken.

+0

Edmond vielen Dank für deine Antwort, ich folge dir ein wenig, wie würde ich es lösen. Würde ich den user.rb ändern müssen? – Omar

+0

@Omar müssen Sie 'set_user' bevor Sie' create_visit'. Fügen Sie 'create_visit' einfach zu Ihrem' only: 'Array in' before_action: set_user' hinzu. –

+0

Edmund hat es bekommen, so dass es mir keinen Fehler mehr gibt, da ich folgendes getan habe, wie Sie vorschlagen: '' before_action: set_user, nur: [: show,: edit,: update,: destroy,: share,: follow ,: create_visit] ''. Nun zu meinen Ansichten, um die Anzahl der Besucher zu zählen. Soll ich folgendes in controller tun - '' @visitprofiles = current_user.visitors.where ('created_at>?', 1.month.ago) '' und in meinen Ansichten einfach tun '' <% = @ visitprofiles.count%> ""? – Omar

Verwandte Themen