删除浅层嵌套的Comment类会返回错误"无法找到没有ID的注释" (导轨)

时间:2015-03-28 03:34:06

标签: ruby-on-rails ruby nested

我有一个基本的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比较新,所以我很感激任何帮助。再次感谢你!

解决方案:

  1. 复数资源:允许的注释:id创建。

  2. 删除时链接到正确的评论ID

  3. 我们的Rails生成注释路由方法将哈希参数作为其参数来生成查询参数。

2 个答案:

答案 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知道您有多个评论。

希望这有帮助!如果您有任何问题,请告诉我。