2017-01-18 3 views
0

Ich versuche eine einfache Rails App zu erstellen, wo Benutzer Kommentare zu Beiträgen hinterlassen können.undefined Methode `user_name 'für nil: NilClass

Wenn ich einen neuen Beitrag verfasse, stoße ich auf einen undefined method 'user_name' for nil:NilClass Fehler.

Insbesondere die folgend:

error page

Wie Sie im Bild @ post.comments sehen können, scheint einen einzigen Kommentar mit null Variablen zu enthalten.

mein Kommentar Controller ist wie folgt:

before_action :set_post 

def create 
    @comment = @post.comments.build(comment_params) 
    @comment.user_id = current_user.id 

    if @comment.save 
     flash[:success] = "You commented the hell out of that post!" 
     redirect_to @post 
    else 
     flash[:alert] = "Check the comment form, something went horribly wrong." 
     redicect_to @post 
    end 
end 

#... 

    private 
def comment_params 
    params.require(:comment).permit(:content) 
end 

def set_post 
    @post = Post.find(params[:post_id]) 
end 

Und meine Post-Controller:

before_action :set_post, only: [:show, :edit, :update, :destroy] 
before_action :owned_post, only: [:edit, :update, :destroy] 

#... 

def create 
    @post = current_user.posts.build(post_params) 

    if @post.save 
     flash[:success] = "Your post has been created!" 
     redirect_to @post 
    else 
     flash.now[:alert] = "Your new post couldn't be created! Please check the form." 
     render :new 
    end 
end 

#... 

private 
def post_params 
    params.require(:post).permit(:image, :description) 
end 

def set_post 
    @post = Post.find(params[:id]) 
end 

Danke für die Hilfe. Entschuldigung für grammatikalische Fehler, ich arbeite schon seit einer Weile daran und bin kein guter Speller wenn ich wach bin.

+0

Sind Sie sicher, dass alle Ihre vorhandenen Datensätze user_id haben? Versuchen Sie dies in der Konsole 'Comment.where (user_id: nil) .count' Entfernen Sie diese Datensätze, wenn es nicht 0 ist. –

+0

Keiner meiner vorhandenen Datensätze hat IDs Comment.all kehrt zu Objekten zurück. – Jones

Antwort

0

Einer der Kommentare für diesen Beitrag hat möglicherweise keinen Benutzer. Sie können die try-Methode hier verwenden.

@comment.try(:user).try(:user_name) 

Aber der ideale Weg, dies zu handhaben wäre eine Präsenz Validierung des Benutzermodell hinzufügen, so dass alle Kommentare von jedem Benutzer in Zukunft erstellt werden einen Namen haben.

+0

@ZhongZheng Antwort ist genau richtig! –

+0

Mein Kommentarmodell hat zur Zeit 'validates: user_id, present: true' (zusätzlich zu gehört) Gibt es noch etwas, das ich hinzufügen sollte? – Jones

1

try Änderung

@comment.user_id = current_user.id 

zu

@comment.user = current_user 

Sie müssen entweder sicherstellen, dass comment nicht ohne Benutzer/User_id gespeichert wird, oder Sie müssen den Fall in Aussicht behandeln, in denen Benutzer/user_id ist null

+0

Wie kann ich sicherstellen, dass Kommentare mit den benötigten Daten gespeichert werden? 'comment_params' sieht momentan so aus:' params.require (: comment,: user_id) .permit (: content) ', und ich bekomme immer noch den Fehler. Warum hat @post.comments überhaupt irgendwelche Elemente? – Jones

+0

sollte es sein: 'params.require (: Kommentar) .permit (: content,: user_id)' –

1

Sie fragen nach dem Namen des Benutzers, aber Sie erlauben derzeit keine Benutzer-ID in Ihrem comment_params:

Diese

:

def comment_params 
    params.require(:comment).permit(:content) 
end 

Sollte sein:

def comment_params 
    params.require(:comment).permit(:content, :user_id) 
end 

Es ist auch möglich, dass Ihr Code sein sollte:

comment.user.name 

statt

comment.user.user_name 

müssten wir Ihr Modell zur Bestätigung sehen. Ich würde user_name nicht als Attribut von user verwenden.

+0

Wenn es ein Problem mit dem Methodennamen war. Warum sollte ich einen Nil: NilClass Fehler bekommen? Das Problem ist, dass ich einen Kommentar erstelle, bei dem alle Variablen bis auf eine Null sind. – Jones

Verwandte Themen