了解link_to以删除嵌套资源

时间:2017-11-18 20:27:00

标签: ruby-on-rails link-to

我也在学习ruby和rails。我理解link_to和删除项目如何使用单个资源。

<%= link_to 'Destroy', article_path(article),
          method: :delete,
          data: { confirm: 'Are you sure?' } %>

这是有效的,因为它使用了article_path并使用了rails magic所需的文章。尽管文章已经传入,并且有一篇包含DELETE的路径文章,它需要:id

Prefix   Verb   URI Pattern              Controller#Action
article  GET    /articles/:id(.:format)  articles#show
         DELETE /articles/:id(.:format)  articles#destroy

然而,在将资源嵌套在其中之后说,评论

要删除评论,它就会变为

<%= link_to 'Destroy Comment', [comment.article, comment],
method: :delete, data: { confirm: 'Are you sure?' } %>

以下是嵌套资源的(相关)路由(注意:省略格式)

Prefix          Verb    URI Pattern                        Controller#Action
article_comment GET     /articles/:article_id/comments/:id comments#show
                DELETE  /articles/:article_id/comments/:id comments#destroy

控制器代码

def destroy
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
    @comment.destroy
    redirect_to article_path(@article)
  end

查看代码

<h3>Comments</h3>
<% @article.comments.each do |comment| %>
  <p>
    <strong> <%= comment.username %> </strong>: <%= comment.body %>
    <!-- link_to goes here -->
  </p>
<% end %>

Q1)

首先,是否有另一种删除注释的语法,即在[comment.article, comment]结构中执行article_comment_path(comment)的另一种方式(与第一个代码块中的非嵌套资源一样)。

Q2)

[comment.article, comment]表示/做什么以及如何使用

转换为正确的路线

DELETE /articles/:article_id/comments/:id comments#destroy

(Rails有很多语法糖(我来自Java背景)所以我编码我试图不使用语法糖,直到我完全理解它。)

<{3}}

This code is all from section 5.13 (non nested resources)section 8 (nested resources)

1 个答案:

答案 0 :(得分:0)

对于Q1)我找到了答案

想要的替代语法是

article_comment_path(@article.id, comment.id)

总体而言

<%= link_to 'Destroy comment', article_comment_path(@article.id, comment.id), method: :delete, data: {confirm: 'Are you sure?'} %> This answer was helpful

您需要文章和评论的ID的原因是,由于DELETE路由的结构方式,它们是必需的。 @article.id需要articles/:article_id/comment.id需要comments/:id

我还想在link_to中添加article_comment_path(@article.id, comment.id),可以替换为[@article, comment]。但是,如果使用此数组输入方法无法指定id,则必须传递整个对象。所以你不能做 [@article.id, comment.id](虽然我有点理解这个数组语法与link_to我还没有得到q2如何工作)。