Rails has_many错误 – 无法找到ID

我有一个评论和回复。 评论has_many回复

的routes.rb

resources :comments do resources :replies end 

当我打开评论/索引然后选择评论/显示我打印有关该评论的所有回复的信息。

  

我也可以创建另一个回复。 这一切都正常。

当我决定编辑其中一个回复时出现问题。

  

奇怪的是,如果有一个ID与我想要修改的回复ID相同,则编辑工作正常。 甚至不需要我想修改的特定回复属于该评论。 但是如果我想编辑带有ID的回复,例如66,但是没有id为66的注释,我收到一个错误:

 Couldn't find Comment with 'id'=65  

这是回复/ _form.html.erb,它显然也可以作为编辑表单。 在这种情况下,reply.id为65,它正在查找具有相同ID的注释,该注释不存在。

你试过了吗?

 <%= link_to 'Edit', edit_comment_reply_path(reply) %> 

你的控制器是什么样的? 此外,您应该无法访问不属于您的评论的回复。 看看使用适当的范围和授权。 我猜它唯一有效的原因是运气; 因为你确实有一个与reply_id匹配的comment_id,所以调用不会失败。

好的,你也可以发表你的评论控制器。 几点:在相关function中使用授权(建议;假设您正在使用策略)

 def edit authorize @reply end 

如果您打算传入注释ID,则还应该set_comment(不仅仅是在create中)。 这样,您还可以确保不使用不属于您的用户的注释(或其他一些不需要的行为)执行回复编辑。

而且,你质疑有关寻找Id 66的讨论,但错误提到了ID 65.这只是一个错字吗?

RepliesController中将set comment方法更改为

  def set_comment @comment = Comment.find(reply_params[:comment_id]) end 

问题在于这行代码。

<%= link_to 'Edit', edit_comment_reply_path(@comment.replies,reply) %>

edit_comment_reply_path方法将@comment作为其第一个参数。

应该是正确的代码

 <%= link_to 'Edit', edit_comment_reply_path(@comment, reply) %> 

@comment是您已在控制器edit操作中指定了@comment

 def edit @comment = Comment.find(params[:comment_id]) end 

要么

 before_action :set_comment, only: [:create, :edit] 

关键是您必须在视图的正确操作中设置@comment

form_for不正确。 你可以传入params[:id] ,这是@replyid

 <%= form_with(model: @reply, url: comment_reply_path(@comment, @reply)) do |form| %>