2017-02-18 2 views
0

ich endlich in der Lage war, ein Benutzermodell mit einem Post-Modell gefunden:Hinzufügen Kommentar Modell mit einem post/Benutzermodell zu verknüpfen

def create 
@post = Post.new(post_params) 
@post.user = current_user 

Im Moment ist ich versuche, einen Kommentar in den Post#Show zu erstellen Seite aber weiterhin einen Fehler bezüglich meines Formulars erhalten. Die beiden Fehler, die ich renne in sind:

NoMethodError in Posts#show undefined method `comments_path' 

wenn ich @comment = Comment.new in Post#show haben. Wenn es entfernt wird, bekomme ich:

ArgumentError in Posts#show First argument in form cannot contain nil or be empty 

Was könnte möglicherweise mit meinem Formular falsch sein? Auch wenn jemand einen besseren Weg empfehlen kann, meine 3 Modelle zu verbinden (im Grunde habe ich eine user_id und eine post_id wenn ein Kommentar erstellt wird, bin ich offen für Vorschläge). Mein Kommentarformular wird auf der Seite Post#Show erscheinen. Meine aktuellen Code ist:

Kommentar Modell

belongs_to :user 
belongs_to :post 

Benutzermodell

has_many :posts 
has_many :comments 

Beitrag Modell

has_many :comments 
belongs_to :user 

Kommentar-Controller

class CommentsController < ApplicationController 
before_action :find_comment, only: [:show, :edit, :update, :destroy] 

def index 
    @comments = Comment.all 
end 

def new 
    @comment = Comment.new 
end 

def create 
    @post = Post.find(params[:id]) 
    @comment = @post.comments.build(comment_params) 
    @comment.user = current_user 

    if @comment.save 
    flash[:notice] = "Successfully created..." 
    redirect_to comments_path 
    else 
    flash[:alert] = "failed" 
    redirect_to root_path 
    end 
end 

def show 
end 

def edit 
end 

def update 
    if @comment.update 
    flash[:notice] = "You updated your comment" 
    else 
    flash[:alert] = "Failed to update" 
end 

def destroy 
    @comment.destroy 
    redirect_to '/' 
end 

private 

    def find_comment 
    @comment = Comment.find(params[:id]) 
    end 

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

Beitrag Controller-

class PostsController < ApplicationController 
    before_action :find_post, only: [:show, :edit, :update, :destroy] 

    def index 
    @posts = Post.all 
    end 

    def new 
    @post = Post.new 
    end 

    def create 
    @post = Post.new(post_params) 
    @post.user = current_user 
    if @post.save! 
     flash[:notice] = "Successfully created..." 
     redirect_to posts_path 
    else 
     flash[:danger] = "failed to add a post" 
     render 'new' 
    end 
    end 

    def show 
    end 

    def edit 
    end 

    def update 
    if @post.update 
     flash[:notice] = "Successfully updated" 
     redirect_to post_path 
    else 
     flash[:alert] = "Failed to update Post" 
     redirect_to :back 
    end 
    end 

    def destroy 
    if @post.destroy 
     flash[:notice] = "Successfully delete" 
     redirect_to posts_path 
    else 
     flash[:danger] = "Wasn't able to delete Blog post." 
     redirect_to :back 
    end 
    end 

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

    def post_params 
     params.require(:post).permit(:title, :body, :description) 
    end 
end 

Post # Sicht anzeigen

<%= render '/comments/form' %> 

Kommentar # Form

Wenn etwas fehlt, bitten Sie mich, meinen Beitrag zu aktualisieren. Danke an alle, die mir helfen, mein Problem besser zu verstehen.

Antwort

1

Ihre Assoziationen scheinen gut zu sein. Der Fehler

NoMethodError in Posts#show undefined method `comments_path' 

bedeutet, dass Sie nicht die Route comments_path oder Comments#Create haben. Grundsätzlich, wenn Sie einen form_for mit einem Comment als Parameter haben, nimmt es an, dass Sie auf die create oder update Route gehen möchten, je nachdem, ob es sich um einen neuen Datensatz handelt. Am einfachsten ist es,

resources :comments 

zu Ihrer Routes-Datei hinzuzufügen.Da jedoch Sie einen Kommentar im Zusammenhang mit einem Beitrag wollen, möchten Sie Ihre Routen-Datei ändern haben:

resources :posts do 
    resources :comments 
end 

Dann ändern Sie Ihre Form wie folgt aussehen:

<%= form_for [@post, @comment] do |f| %> 

Also, wenn Sie einreichen ein Formular, Sie werden eine params[:post_id] und eine params[:id] haben mit zu spielen. Finden Sie die Post mit der params[:post_id]. Ignoriere die params[:id], wenn du einen Kommentar erstellst, aber verwende ihn, wenn du einen Kommentar aktualisierst.

Edit: Here ist ein Link zu etwas Hilfe in Bezug auf Nested Resourcing.

+0

Vielen Dank für Ihre Antwort. Irgendwie habe ich es vermisst Ressourcen hinzuzufügen: Kommentare. Haben Sie eine Frage zu verschachtelten Assoziationen? Wenn ich das tue, wird es bei der Auflistung aller Kommentare posts /: id/comments geben. Ist das besser, wenn Sie versuchen, sie stattdessen in der Post-Show zu zeigen? –

+0

Ich habe jetzt auch einen Fehler, nachdem ich die Änderungen vorgenommen habe. Es heißt für meinen Kommentar create controller with Konnte Post mit 'id' = nicht finden. Nachdem ich einen Kommentar erstellt habe, merke ich, dass er mich zu Posts /: ID/Kommentaren bringt. Liegt es an meinem redirect_to im Controller? Danke für die Hilfe. –

+0

Sie können es in beide Richtungen tun. Verschachtelte Ressourcen sind eine strukturierte Art, Dinge zu tun, besonders für Anfänger. Sie müssten die 'Post' mit' params [: post_id] 'und' Comment' mit 'params [: id]' finden (wenn der Kommentar bereits erstellt wurde). –

Verwandte Themen