Rails has_many错误 - 无法找到ID

时间:2017-11-25 14:26:38

标签: ruby-on-rails database oop

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

的routes.rb

resources :comments do
  resources :replies
end

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

<% @comment.replies.each do |reply| %>

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

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

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

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

Couldn't find Comment with 'id'=65
<%=form_with(model: @reply, url: [Comment.find(params[:id]), @reply]) do |form| %>

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

5 个答案:

答案 0 :(得分:0)

问题在于这行代码。

<%= 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

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

或者

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

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

form_for不正确。您可以传递params[:id] id @reply。{/ p>

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

def edit
  authorize @reply
end

如果你计划传递评论ID,你也应该set_comment(不仅仅是在创建中)。这样,您还可以确保不使用不属于您的用户的评论(或其他一些不需要的行为)执行回复编辑。

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

答案 3 :(得分:0)

RepliesController中将设置的评论方法更改为

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

答案 4 :(得分:0)

你试过吗?

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