我有评论和回复。 评论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的注释,该注释不存在。
答案 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) %>