2014-02-24 127 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