2014-02-24 77 views
2
  1. 我做一个Rails博客教程,并不能完全理解下面的link_to代码Ruby on Rails link_to对n00b的解释?

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

    为什么我必须使用:

    [comment.post, comment] 
    

    ,为什么我不能呢只写:

    @post.comment 
    
  2. 我的第二个相关的问题是,因为我创建在控制器中的“毁灭”行动如下:

    def destroy 
        @post = Post.find(params[:post_id]) 
        @comment = @post.comments.find(params[:id]) 
        @comment.destroy 
        redirect_to post_path(@post) 
    

    为什么没有我在的link_to代码提“消灭”?

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

回答

2

为什么你必须提供邮政对象和评论到的link_to助手两者的原因是因为评论是在发表一个嵌套的资源,并且两个ID必须以构造URL被称为。它实际上相当于:

link_to 'Destroy Comment', post_comment_path(comment.post, comment), ...

它在做什么是它的解决路径帮手为你使用url_for。请参阅http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects

您不必在您的link_to中提及销毁,因为销毁是行为的名称。您的路线文件概述了哪些控制器和操作与哪些路线相关联。

我假设你使用的是资源丰富的路由,这是为所有CRUD操作定义路由的简写方式。有关HTTP动词和控制器操作之间的映射,请参见http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions。您会看到delete映射到destroy,并且您在link_to上使用method: :delete

1

所以这里有很多事情要做。

1)我的猜测是link_to在第一部分是在一个循环内。真的吗?这将是类似@post.comments.each do |comment|。如果是这种情况,那么可能发生的事情是你有评论嵌套在帖子下。该文档可以在here找到。括号用于标识注释,您需要输入post id。你也可以做[@post, comment],这也可以。您不能只写@post.comment,因为没有足够的信息来识别正确的评论。

2)Rails通过HTTP动词来确定从控制器调用哪个动作。您正在向/posts/:post_id/comments/:id发送一个HTTP DELETE请求,然后路由文件找出它属于评论控制器。该文档可以找到herehere