我有一个基本的Rails应用程序,我在帖子中嵌套了我的Comments类。帖子嵌套在主题中。我试图使用销毁操作删除评论并提出错误"无法找到没有ID的评论"
错误讯息:
ActiveRecord::RecordNotFound at /posts/46/comments
Couldn't find Comment without an ID
CommentsController#destroy
def destroy
**@comment = @post.comments.find(params[:id])**
authorize @post
authorize @comment
if @comment.destroy
flash[:notice] = "Comment was removed."
的routes.rb
resources :topics do
resources :posts, except: [:index]
end
resources :posts, only: [] do
resource :comments, only: [:destroy, :create, :new]
end
comments_controller
def destroy
@comment = @post.comments.find(params[:id])
authorize @post
authorize @comment
if @comment.destroy
flash[:notice] = "Comment was removed."
redirect_to :action => 'destroy'
else
flash[:error] = "Comment couldn't be deleted. Try again."
redirect_to [@post.topic, @post]
end
end
注意,我已经设置了一个before_action来定义@post
@post = Post.find( params[:post_id])
我一直在寻找删除current_session的方法,而不是寻找没有运气的评论ID。
我的猜测是评论中没有附加ID,但根据我的路线,我无法理解为什么。当我耙路线时,我得到了
post_comments POST /posts/:post_id/comments(.:format) comments#create
new_post_comments GET /posts/:post_id/comments/new(.:format) comments#new
DELETE /posts/:post_id/comments(.:format) comments#destroy
也许问题是DELETE / posts /后没有/:id:post_id / comments /:id?
这是我的第一个rails应用程序,我对Ruby比较新,所以我很感激任何帮助。再次感谢你!
解决方案:
复数资源:允许的注释:id创建。
删除时链接到正确的评论ID
我们的Rails生成注释路由方法将哈希参数作为其参数来生成查询参数。
答案 0 :(得分:0)
您认为原因是缺少:id
参数是正确的。
您拥有的方法将销毁使用@post.comments.find(params[:id])
找到的单数注释。
由于未发送:id
,因此该方法无法识别要销毁的评论。
如果您想要删除单个评论,则需要相应地修改您的路径,并DELETE
改为/posts/:post_id/comments/:id
。
如果要删除帖子的所有评论,可以将方法修改为:
@comments = @post.comments
if @comments.destroy
...
答案 1 :(得分:0)
利亚,
欢迎来到Rails社区!
你绝对正确;如果您想删除一条评论,您的路线需要接受:id才能发表评论。但是,您目前将其设置为resource :comments
。您实际上想要使用resources :comments
,因此Rails知道您有多个评论。
希望这有帮助!如果您有任何问题,请告诉我。