Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails链接到n00b的解释?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails RubyonRails链接到n00b的解释?

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

我正在做一个Rails博客教程,不完全理解以下代码链接

<%= 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?' } %>