【问题标题】:Rails has_many error - Couldn't find IDRails has_many 错误 - 找不到 ID
【发布时间】:2017-11-25 14:26:37
【问题描述】:

我有一个评论和回复。 评论有_许多回复

routes.rb

resources :comments do
  resources :replies
end

当我打开 cmets/index 然后选择 cmets/show 时,我会打印与该评论相关的所有回复的信息。

<% @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 但不存在的评论。

【问题讨论】:

  • 您可以将rake routes 的输出添加到您的问题中吗?
  • @xeon131 是的,我现在就去做

标签: ruby-on-rails database oop


【解决方案1】:

你试过了吗?

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

【讨论】:

  • 谢谢!这只是让我进入编辑链接。现在,当我点击更新时,我遇到了另一个问题。
【解决方案2】:

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

【讨论】:

  • @MichaelJamati 我将编辑我的帖子并添加回复控制器
【解决方案3】:

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

def edit
  authorize @reply
end

如果你打算传入评论 id,你还应该 set_comment(不仅仅是在创建中)。这样,您还可以确保不使用不属于您的用户的评论(或其他一些不受欢迎的行为)执行回复编辑。

而且,您的问题谈到寻找 ID 66,但错误提到 ID 65。这只是一个错字吗?

【讨论】:

  • 我的解释只是一个例子。当我在编辑中添加 set_comment 时,我遇到了另一个错误@MichaelJamati
【解决方案4】:

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

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

【讨论】:

  • ActiveRecord::RecordNotFound (Couldn't find Comment with 'id'=): app/controllers/replies_controller.rb:80:in `set_comment' 但我认为 post_id 和 comment_id 是重复的实例,所以它们具有相同的值@xeon131
  • 哦,好的,您可以发布您的方案吗?
  • 我刚刚添加了它
  • 您可以在编辑操作中添加binding.pry 并发布params 吗?或发布调试输出(从您的服务器(rails s)运行的位置记录)
  • 无论post_idcomment_id 是否以某种方式重复并具有相同的值,强烈建议您保持命名约定的一致性。如果您不再使用帖子,并且回复只是属于 cmets,那么请坚持参考comment_id(如果适用)。这将使跟踪记录和调试更容易。
【解决方案5】:

问题出在这行代码上。

&lt;%= link_to 'Edit', edit_comment_reply_path(@comment.replies,reply) %&gt;

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

正确的代码应该是

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

前提是您在控制器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| %>

【讨论】:

  • 我刚刚添加了它@jackii
  • 如果我将@comment 添加到 before_action :set_comment 我得到另一个错误参数丢失或值为空:reply 导致错误的行是reply_params 代码
  • 如果他将@comment 传递给edit 方法。无需在创建操作之前添加set_comment 方法。对吗?
  • @John 请尝试我的答案,更改 form_for
  • @jackii 当我使用 form_with 时我有未定义的方法 `replies_path' RubyMine 的建议是找不到字段@reply 的声明。
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多