2011-12-29 279 views
1

我有以下嵌套的資源用於新的行動POST請求:當Rails的路線產生嵌套資源

resources :listings do 
    resources :offers do 
    member do 
     put "accept" 
     put "reject" 
    end 
    end 
end 

在我的列表/ show.html.haml,我有

= button_to "Make Offer", new_listing_offer_path(@listing) 

現在,我按一下按鈕,鐵軌產生一個POST請求,因此錯誤:

Started POST "/listings/2/offers/new" for 127.0.0.1 
ActionController::RoutingError (No route matches "/listings/2/offers/new"): 

如果我刷新(GET請求),那麼頁面DISPLA ys正確。

我相信這個不正確的路由只發生在我添加兩個額外的動作:接受和拒絕,這恰好是POST動作。

這是Rails中的錯誤,還是我的錯?我應該如何防止這個錯誤?

謝謝。

回答

2

button_to幫助程序會爲您創建一個表單,默認情況下,它會向您指定的URL(「/ listings/2/offers/new」)發送POST請求。

您指定的路由不會生成處理POST請求到/ new的路由。您可以通過運行「rake routes」任務來檢查您生成的路線和他們將要響應的動詞。

如果您只想鏈接到表單,請將您的「button_to」更改爲「link_to」,然後添加CSS以增添美感。

= link_to "Make Offer", new_listing_offer_path(@listing) 

(這GET將路由到您OfferController的新動作)

如果您正在尋找真正POST數據,你可能會需要您的使用情況更改爲:

= button_to "Make Offer", listing_offers_path(@listing) 

(此POST會路由到您的OfferController的創建操作。)

+0

感謝Mike。從你的提示中,我意識到我可以添加:method =>:進入button_to。有用。 – AdamNYC 2011-12-29 17:51:31

+0

沒問題。是的,這也可以工作,但除非它是搜索表單或其他東西,否則使用表單提交來執行GET只會讓我感到尷尬,所以故意留下該解決方案......但它確實有效! – miked 2011-12-29 18:29:27