2012-01-03 93 views
1

我有一個表單來更新模型的屬性 - 我不希望它轉到標準更新操作,我希望它轉到不同的操作。在form_for action中傳遞id

<% for car in @cars %> 
<%= form_for car, :url => { :action => "custom_action/#{car.id}" } do |f| -%> 

這是給下面的錯誤 -

No route matches {:action=>"custom_action/1", :controller=>"cars"} 

但是,如果我訪問的URL - custom_action/1 - 我沒有得到路由錯誤。

任何想法,爲什麼我不能這樣做?

回答

3

除了Frederick Cheung對GET和POST與PUT的說法之外,我認爲你的代碼可能是錯誤的。

做的正是你想要的東西,嘗試:

form_for car, :url => {:action => "custom_action", :id => car, :controller => "cars"} do |f| 

我不認爲這是一個好主意,並可能會引起你痛苦。我建議看看Ruby on Rails Routing Guide,瞭解如何正確地做到這一點。 (路由是一個話題,我總是要諮詢手冊)。

有了正確的路由你的代碼應該是這個樣子:

form_for car, custom_action_car_path(car) do |f| 

,這將是更容易在未來的改變,如果/當你重構你的應用程序。

+0

非常感謝 - 現在查看路線。 – Finnnn 2012-01-03 15:24:49

+0

在你的路線中,你會想要一些像資源:汽車; post:custom_action,:on =>:member;那麼你可以在你的控制器和視圖中使用'custom_action_cars_path(car)'。 – 2012-01-03 15:31:58

1

如果你去到URL通過鍵入到地址欄,你正在做一個GET請求,而形式發出默認POST的要求,在這種情況下可能會發出PUT請求(因爲你表現在現有記錄上)。

這聽起來像你的路線只是路由GET請求。假設您說自定義操作確實更新了記錄,則聽起來您應該更新路由以接受PUT請求。

+0

謝謝,這是有道理的。按照Ryan的回答,我會嘗試對我的路線進行排序。 – Finnnn 2012-01-03 15:24:18