2013-02-18 51 views
0

我是Learning Rails。許多公約很有意義。映射到控制器動作的代碼的慣例是奇數:Rails默認的restful資源代碼背後的邏輯是什麼?

//code     url    controller action 
tweets_path    /tweets/   def index 
tweet     /tweet/ID   def show 
new_tweet_path   /tweets/new  def new 
edit_tweet_path(tweet) /tweets/ID/edit def edit 

爲什麼不在同一個對稱的方式作爲控制器的動作完成的自動生成方法幫手?例如:

//code 
tweet_index 
tweet_show(tweet) 
tweet_new 
tweet_edit(tweet) 

我很新的我敢肯定有一個非常好的理由,我只是不知道它:)它不是對稱

+0

不錯的問題,我認爲這只是一個慣例..我喜歡「tweets_path」的聲音,我希望看到這條路線中的所有推文,這就是默認顯示的內容。 :) – Kaeros 2013-02-18 18:49:31

+0

我發現這個,它_almost_解釋了爲什麼:https://blogs.oracle.com/divas/entry/restful_rails_tutorial – SimplGy 2013-02-18 18:53:57

回答

1

這裏有兩種不對稱。

首先是複數與單數路線助手。爲什麼有些幫手tweets_*幫手,而其他人是tweet_*幫手?

答案是某些資源路由是成員路由和其他是集合路由。成員路由必須處理一個資源實例,並且集合路由必須將資源的所有實例作爲一個組處理(除非資源在單個情況下不存在收集路由)。索引操作是集合路由,並且顯示操作是成員路由。

您可以聲明自己的成員和收集路線是這樣的:

# routes.rb 
resources :tweets do 
    member do 
    get :duplicate 
    end 
    collection do 
    get :summarize 
    end 
end 

這將創建除了通用的標準兩個幫手。請注意,Rails將創建適當單數或複數的路由助手。

  1. 一個summarize_tweets_path幫手,這並不需要一個參數
  2. 一個duplicate_tweet_path幫手,做

官方的文檔here

第二個不對稱的行動留出了幫手的許多內置資源的行動。我想這可能是爲了簡潔,但我不知道。

編輯

考慮這件事後,行動名字下降了,因爲有路徑Rails和REST超載。根據HTTP動詞,'/ tweet /:id'路徑可以是顯示,更新或刪除操作。基本上,路徑告訴你你正在操作什麼,但不知道要採取什麼行動。

+0

多元映射到成員VS集合是很有意義的。我愛這個約定。 – SimplGy 2013-02-18 19:45:46

0

一個原因是,映射取決於在HTTP動作上。例如,一個GET to/tweets映射到索引操作,但POST/tweets映射到create操作。

1

助手方法的方式,使得通過使它們更像句子的一部分它們更可讀生成。說'創建一個新的推文鏈接'聽起來比'創建一個新的推文鏈接'更好。在命名任何自定義操作時,記住這一點也很有幫助,使用適合句子的名稱可以更容易地理解和記憶,因爲這是我們如何學會說話。

+0

我忘記了Ruby哲學的這個重要部分。好點子。 – SimplGy 2013-02-18 20:06:17

相關問題