2017-11-14 2 views
0

Ich erstelle eine meiner ersten RoR-Anwendungen - ein Forum. Ich versuche, dem Forum Kommentare hinzuzufügen, aber ich bekomme einige Fehler. Ich habe für ähnliche Probleme gegoogelt, aber keine scheint mein Problem zu lösen. Hier ist mein Code:Ruby on rails - Kommentare können nicht erstellt werden. NoMethodError

Kommentare Controller:.

class CommentsController < ApplicationController 
    def create 
    @forum = Forum.find(params[:forum_id]) 

    if [email protected]? 
     puts "Forum object is not nil" 
    end 

    @comment = @forum.comment.create(comment_params) 

    redirect_to forum_path 
    end 

    private 

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

Das Forum Controller automatisch generiert wird, und ich habe nicht verändert (erzeugt Schienen erzeugen Gerüst Forum verwenden, wenn Sie es immer noch sehen wollen, lassen Sie ich weiß)

class Comment < ApplicationRecord 
    belongs_to :forum 
end 

class Forum < ApplicationRecord 
    has_many :comments 
    validates :title, presence: true, 
    length: {maximum: 50} 
    validates :body, presence: true 
end 

die folgende Formular aus dem show.html.erb für Abschnitt ist für das Forum, um

<h2>Comments</h2> 

<% @forum.comments.each do |comment| %> 
<p> 
    <%= comment.body %> 
</p> 

<% end %> 

<h2>Add a comment</h2> 

<%= form_for([@forum, @forum.comments.build]) do |f| %> 
<p> 
    <%= f.label :body %><br/> 
    <%= f.text_area :body %> 
</p> 
<p> 
    <%= f.submit %> 
</p> 
<% end %> 

Und das ist der Fehler von Schienen:

undefined method `comment' for #<Forum:0x444d518> 

mit dem folgenden Auszug:

end 
@comment = @forum.comment.create(comment_params) #highlighted 
redirect_to forum_path 
end 
+2

1) Rails 3-Wege veraltet ist. 2) Bitte formatieren Sie Ihren Beitrag. – coreyward

+0

Ich stimme mit coreward überein, Wenn dies eine neue App ist, würde ich Rails 5 empfehlen. Wenn Sie eine etwas ältere Version möchten, verwenden Sie die neuesten Rails 4. Übrigens, die Tatsache, dass Ihre Modellklasse von 'ApplicationRecord' erbt zu glauben, dass Sie Rails 5 verwenden. –

Antwort

1

Das Problem ist mit dieser Zeile @comment = @forum.comment.create(comment_params) in Ihrem CommentsController. Es sollte @comment = @forum.comments.create(comment_params) sein. comments sollte Plural sein.

sollte Ihr Code sein:

class CommentsController < ApplicationController 
    def create 
    @forum = Forum.find(params[:forum_id]) 
    @comment = @forum.comments.create(comment_params) 
    redirect_to forum_path 
    end 

    private 

    def comment_params 
    params.require(:comment).permit(:body) 
    end 
end 
+0

Dies wurde verwendet, um meinen Code zu refaktorieren. – User59

1

Sieht aus wie Sie eine has_many :comments Vereinigung in Ihrem Forum Modell fehlen. Hör zu.

Alternativ können Sie, wenn die Verknüpfung has_many beendet wird, 'Kommentare' für jedes Forum-Objekt aufrufen, nicht 'Kommentar'.

wenn Sie einen Kommentar für ein bestimmtes Forum erstellen möchten, können Sie so tun, wie folgt:

@comment = Comment.create(comment_params) #create a comment associated with this forum. 
+0

Es hat dies. Ich überprüfte – User59

+0

Doing, was Sie vorgeschlagen, gibt diesen Fehler: falsche Anzahl von Argumenten (2 für 0..1) – User59

+0

Sorry für die Verzögerung, war ein bisschen beschäftigt. Lassen Sie mich wissen, ob die bearbeitete Version funktioniert. Übergeben Sie einfach die starke comment_params an die create-Methode. – kparekh01

0

Vergewissern Sie sich, eine comments Verein im Forum Modell:

class Forum < ApplicationRecord 
    has_many :comments 
end 
0

So, Das Problem lag im CommentsController.

Ich habe die Kommentare Controller diese stattdessen zu tun:

def create 
     @forum = Forum.find(params[:forum_id]) 

     @comment = Comment.new(comment_params) 
     @comment.forum_id = @forum.id 
     @comment.save! 

     redirect_to forum_path(@forum) 
    end 


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

Schien den Trick zu tun.

Vielen Dank an alle, die eine Antwort gaben.

+0

Es gibt einen besseren Weg, dies zu tun. Bitte überprüfe meine Antwort. –

+0

Verwenden Sie stattdessen '@comment = @ forum.comments.new (comment_params)' und '@ comment.save' –

Verwandte Themen