在我的项目中有2个嵌套资源:
Rails.application.routes.draw do
resources :posts do
resources :comments
end
root 'posts#index'
end
我正在使用部分_comment.html.erb
呈现一组评论 <%= render partial: "comments/comment", collection: @post.comments %>
部分看起来像这样
<div class="comment_wrapper">
<p class="comment_name"><%= comment.name %></p>
<p class="comment_date"><%= comment.created_at %></p>
<p class="comment_body"><%= comment.body %></p>
<%= link_to "Delete comment", post_comment_path(@post.id, id: comment.id), method: :delete%>
</div>
问题在于“删除评论”链接中的嵌套路由。
我一直未能传递:id
密钥。我尝试了几种不同的方法来传递链接中的变量,但是仍然遇到相同的错误,:id
键丢失了。当我用段落替换链接以显示comment.id
时,它会完美显示,因此在我看来它肯定可用。
No route matches {:action=>"show", :controller=>"comments", :format=>nil, :id=>nil, :post_id=>11} missing required keys: [:id]
正如你所看到的,它也试图调用“show”动作,但我敢打赌,只要它正确通过id就会解决。 我在这里做错了什么想法?
答案 0 :(得分:1)
如您所见,错误是
没有路线匹配{:action =&gt;“show”,:controller =&gt;“comments”,:format =&gt; nil,:id =&gt; nil ,:post_id =&gt ; 11}
在你的link_to中有comment.id:
<%= link_to "Delete comment", post_comment_path(@post.id, id: comment.id), method: :delete %>
这意味着您正在传递一个没有id的对象(未保存在数据库中)。你可能正在构建你的评论,这就是他们还没有id的原因。
此问题的解决方案之一是使用您的link_to:
<%= link_to("Delete comment", post_comment_path(@post, comment), method: :delete) unless comment.new_record? %>
这不会显示新记录的链接,因为您无法删除数据库中尚不存在的内容。