Ruby on rails RubyonRails链接到n00b的解释?
我正在做一个Rails博客教程,不完全理解以下代码链接Ruby on rails RubyonRails链接到n00b的解释?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在做一个Rails博客教程,不完全理解以下代码链接 <%= link_to 'Destroy Comment', [comment.post, comment], method: :delete, data: { confirm: 'Are you sure?' } %> 为什么我不能写: @post.comment 我的第二个相关问题是,由于我在控制器中创建了如下“销毁”操作: def destroy @post = Post.find(p
<%= link_to 'Destroy Comment', [comment.post, comment],
method: :delete,
data: { confirm: 'Are you sure?' } %>
为什么我不能写:
@post.comment
def destroy
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
@comment.destroy
redirect_to post_path(@post)
结束
为什么我不在代码链接中提到“销毁”
<%= link_to 'Destroy Comment', [comment.post, comment],
method: :delete,
data: { confirm: 'Are you sure?' } %>
您必须向link_to helper提供Post对象和注释的原因是,注释是Post中的嵌套资源,并且必须知道这两个ID才能构造URL。它实际上相当于:
链接到“销毁评论”,发布评论路径(Comment.post,Comment),…
它所做的是为您解析路径帮助程序,使用url\u for
。看
您不必在链接到的中提到destroy,因为destroy是操作的名称。路由文件概述了与哪些路由关联的控制器和操作
我假设您正在使用资源路由,这是为所有CRUD操作定义路由的简写方式。有关HTTP谓词和控制器操作之间的映射,请参阅。你会看到delete
被映射到destroy
,你在你的链接上使用方法::delete
,,所以这里有很多事情
1) 我的猜测是,第一部分中指向
的链接在一个循环中。这是真的吗?这类似于@post.comments.each do | comment |
。如果是这样的话,那么很可能发生的事情是你在帖子下面嵌套了评论。可以找到这些文件。括号用于标识注释,您需要一个post
id来标识该注释。你也可以做[@post,comment]
,这也同样有效。你不能只写@post.comment
,因为它没有足够的信息来识别正确的评论
2) Rails使用HTTP谓词来标识要从控制器调用的操作。您正在向/posts/:post\u id/comments/:id
发送一个HTTP删除请求,然后路由文件确定该请求属于comments控制器。该文件可在以下位置找到并保存
<%= link_to 'Destroy Comment', [comment.post, comment],
method: :delete,
data: { confirm: 'Are you sure?' } %>