2010-07-07 135 views
1

我試圖只路由一個http動詞。說我有一個評論資源,像這樣:在Rails中路由HTTP動詞

map.resources :comments 

,並希望能夠通過發送DELETE /comments要求銷燬所有意見。即我希望能夠只映射http動詞,而不需要路由的「動作名稱」部分。這可能嗎?

乾杯

回答

2

你可以這樣做:

map.resources :comments, :only => :destroy 

產生類似的路線如下(你可以用rake routes驗證)

DELETE /comments/:id(.:format) {:controller=>"comments", :action=>"destroy"} 

但需要注意的是REST風格的破壞設計用於刪除特定記錄不是全部 r ecords,所以這條路線仍然期待:id參數。黑客可能會傳遞一些哨兵價值:id代表你的應用程序上下文中的「全部」。另一方面,如果您的評論屬於另一個模型,那麼刪除其他模型也會/應該刪除評論。這通常是如何正常發生多行刪除的。

+0

在這種情況下,意見的資源只是虛構的^^有真應了辦法做到這一點,就像默認的「刪除」路線呢... – 2010-07-07 10:41:09

1

由於這不是標準的REST風格,您需要使用自定義路由。

map.connect '/comments', 
    :controller => 'comments', 
    :action => "destroy_all", 
    :conditions => { :method => :delete } 

在你的控制器:

class CommentsController < ApplicationController 
    # your RESTful actions here 

    def destroy_all 
    # destroy all your comments here 
    end 
end 

考慮,調用是這樣的:

<%= link_to "delete all comments", 
     comments_path, 
     :method => :delete, 
     :confirm => "Are you sure" %> 

PS。我沒有測試這個代碼,但我認爲它應該工作。

+0

不會這個動作最好只與 加入map.resources:comments,:collection => {:destroy_all =>:delete} 我覺得只是刪除'收集資源將更'RESTful' ... 感謝您的回覆:) – 2010-07-07 11:21:39

+1

使用:collection屬性會將URL生成爲/ messages/delete_all,並且根據問題是不可取的。 – 2010-07-07 11:27:22