Rails:无法将多个variable-id传递给嵌套路由

时间:2015-08-03 12:08:47

标签: ruby-on-rails routes nested

在我的项目中有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就会解决。 我在这里做错了什么想法?

1 个答案:

答案 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? %>

这不会显示新记录的链接,因为您无法删除数据库中尚不存在的内容。