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.
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? –
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. –
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). –