2011-06-05 41 views
0

我有一個適用於城市初始創建的城市形式,但是當我嘗試更新城市時,我收到路由錯誤。Rails構成創作作品,而不是更新

我的routes.rb:

map.resources :states do |state| 
state.resources :cities 
end 

形式:

<% simple_form_for @city, :url => state_cities_path do |f| %> 
    <%= f.input :name %> 
    <%= f.input :active %> 
    <%= f.submit "Save City" %> 
    <% end %> 

控制器:

if @city.update_attributes(params[:city]) 
    format.html { redirect_to state_cities_path(:state_id => @city.state_id) } 
    format.xml { head :ok } 

錯誤:

No route matches "/states/1/cities" 

現在,如果我點擊地址欄,然後按回車鍵,它就會讓我找到它不存在的路線。創建操作具有相同的redirect_to。

想法?這是POST vs PUT的問題嗎?

+0

嗨@chip,你是否有'城市'的id 1下的記錄? – sameera207 2011-06-05 08:11:19

回答

0

問題是以防萬一這條線

simple_form_for @city, :url => state_cities_path 

你是不是讓表單生成器創建你強迫它的正確途徑。 表單構建器通過檢測是否爲新記錄爲您傳遞的實例創建適當的路由,然後在html表單的action屬性中設置正確的路徑並設置正確的http方法。

似乎你對使用嵌套路線的事實感到困惑,並且正在嘗試傳遞路徑/ URL,因此表單構建器不再檢測任何內容,並且讓你設置所有內容,因爲表單默認情況下發布,而你將URL傳遞給它從未匹配更新操作的創建操作。你只映射到創建操作,因爲更新操作需要這樣

PUT /states/:state_id/cities/:id 

,有什麼是需要匹配更新路由的ID,但你沒有通過ID也不HTTP方法。

解決方案?

讓表單構建器創建路徑,這是通過傳遞具有父實例的數組以及希望表單構建器使用的子實例來嵌套路由來完成的。

simple_form_for [@state,@city] do |f| 

不要忘記把一個值放到@state中,否則會引發一個零錯誤。

現在表單構建器應該正確地爲創建和更新操作構建正確的路徑。

由你也可以重定向到一個數組這樣

redirect_to [@state,@city] 

它會將用戶發送到城市的表演動作的方式。

+0

太棒了。我確實遇到了重定向到show動作的問題,它給了我一個關於缺少動作的錯誤,但我最終重新導向了城市列表,這對我的目的來說也是一樣。非常感激! – chip 2011-06-06 01:56:57

相關問題