2012-07-23 13 views
1

聲明Rails的路線,那種同義詞路線

假設我們有一個清單應用程序,還有它是一個Movement模型,它代表了同類產品購買或銷售產品的任何動作。所以我們有默認的REST路由。

movements GET /movements(.:format)   {:action=>"index", :controller=>"movements"} 
       POST /movements(.:format)   {:action=>"create", :controller=>"movements"} 
new_movement GET /movements/new(.:format)  {:action=>"new", :controller=>"movements"} 
edit_movement GET /movements/:id/edit(.:format) {:action=>"edit", :controller=>"movements"} 
    movement GET /movements/:id(.:format)  {:action=>"show", :controller=>"movements"} 
       PUT /movements/:id(.:format)  {:action=>"update", :controller=>"movements"} 
       DELETE /movements/:id(.:format)  {:action=>"destroy", :controller=>"movements"} 

對於助記符提出,我們希望有一些描述性的途徑,如:

new_purchase  /purchase/new(.:format)  {:controller=>"movements", :action=>"new_purchase"} 
edit_purchase  /purchase/:id/edit(.:format) {:controller=>"movements", :action=>"edit_purchase"} 

如果你能看到purchase的像movement同一型號的,實際上是由MovementsController處理,但是有不同的流量和處理,這由create_purchase而不是create指定。

問題

  1. 我應該如何添加對purchase的寧靜的路線?以指定的HTTP方法,如照顧GETPOSTPUTDELETE

  2. 我應該怎麼寫form_for標籤?使用movement模型我們可以寫出:<%= form_for(@movement) do |f| %>但是如何調用purchase路徑爲createupdate方法?

  3. 我應該如何指定purchase的驗證規則?我已在Movement模型中指定了一些規則,但在提交表單時,它們不適用於purchase

回答

1

你可以使用一些像這樣的事情在你的路由文件

match '/purchase/new(.:format)' => 'movements#new_purchase'  :via => :get 
match '/purchase/:id/edit(.:format)' => 'movements#edit_purchase' :via => :post 

,你可以提到其他人一樣刪除,放於:通過

更多信息看這link 如果你想改變create_create_purchases到移動控制器並改變定義名稱。

關於第二個問題,你可以做這樣的事情

form_tag(:controller => "controller_name", :action => "action_name", :method => "get") 
+0

我在帖子中添加了第二個問題。 – Israel 2012-07-23 03:07:38

+0

使用':via'選項對指定HTTP方法很有用。 – Israel 2012-07-23 03:11:49

+0

希望更新的答案解決了你的第二個問題。先試着用Google搜索你的問題。如果你不能在谷歌找到答案,你可以在這裏發佈:) – 2012-07-23 04:09:16

1

我不認爲你應該尋找一種方式來構建REST風格路線,處理在兩個獨立的方式對象的模型。這聽起來像是你真的在尋找兩個物體。您可以創建一個Purchase模型,該模型從父類型Movement模型中繼承其屬性。

或者,您可以假設它們是相同的對象,並使用語義路徑以相同的方式處理它們,這是合理的。也就是說,您要查找的內容可能是Movement控制器操作的默認RESTful路由的路徑更改。另外,典型的rails慣例是使用多個路徑路徑,這使得索引頁面具有語義意義,並​​識別作爲數據庫中對象表格的子集的對象,所以我使用purchases而不是purchase

resources :movements, :path => "/purchases" 

會產生

movements GET /purchases(.:format)   {:action=>"index", :controller=>"movements"} 
       POST /purchases(.:format)   {:action=>"create", :controller=>"movements"} 
new_movement GET /purchases/new(.:format)  {:action=>"new", :controller=>"movements"} 
edit_movement GET /purchases/:id/edit(.:format) {:action=>"edit", :controller=>"movements"} 
    movement GET /purchases/:id(.:format)  {:action=>"show", :controller=>"movements"} 
       PUT /purchases/:id(.:format)  {:action=>"update", :controller=>"movements"} 
       DELETE /purchases/:id(.:format)  {:action=>"destroy", :controller=>"movements"} 

使用這個模型,form_for輔助方法,仍然可以使用,就像你通常會。假設@movement被正確定義,那麼purchases根的路徑將被正確調用。