我也在学习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 %>
首先,是否有另一种删除注释的语法,即在[comment.article, comment]
结构中执行article_comment_path(comment)
的另一种方式(与第一个代码块中的非嵌套资源一样)。
[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)
答案 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如何工作)。