2011-03-31 134 views
5

在我的config/routes.rb中我有:簡單的Rails 3路由失敗 - 無路由匹配

post "portal_plan_document/update" 

耙路線證實了這一點:

$ rake routes 
portal_plan_document_update POST /portal_plan_document/update(.:format) {:controller=>"portal_plan_document", :action=>"update"} 
.... 

在我的代碼有:

<%= form_for @plan_doc, 
    :url => portal_plan_document_update_path, 
    :method => "POST", :remote => true do |f| %> 

在我的日誌文件我看到:

Started POST "/portal_plan_document/update" for 127.0.0.1 at 2011-03-31 18:04:37 -0400 

ActionController::RoutingError (No route matches "/portal_plan_document/update"): 

我迷失在這裏做什麼。任何幫助將不勝感激!

我應該說我正在使用Ruby 1.9.2和Rails 3.0.5。哦,我在更新routes.rb後重新啓動了服務器(WebBrick w/rails服務器)。

傑里米

+0

我發現,如果我改變:方法=>「POST」到:方法=>「PUT」,改變我的路線關鍵字「發佈」以「放」,所有的作品都很棒。如上所述,將它們更改回「發佈」會導致全部失敗。那麼,把作品,發佈失敗!? – jeremy 2011-04-01 02:29:17

+0

今天我在代碼中發現了同樣的問題。把作品,發佈失敗。 – YenTheFirst 2011-04-06 18:04:18

+0

大多數瀏覽器都不支持除GET和POST請求以外的任何其他功能,因此Rails在POST中使用隱藏字段僞造PUT和DELETE。請參閱Yen的解答。 – Andrew 2011-08-12 16:51:02

回答

7

想通了! :) 如果你有一個非空對象,rails假定你想更新那個對象。即使用'PUT'而不是'POST'來完成'PUT',rails會在窗體中放置一個隱藏的輸入,其中「_method」=「put」。所以,它看起來像是一個POST,但是Rails將它視爲PUT。

如果你真的想更新一個對象(它看起來像你在做什麼),PUT更好,你應該把你的路由切換到PUT。

如果(像我),你正在做一些真正需要POST(即不能超過一次安全發送更多),你可以寫你的form_for這樣的:

<%= form_for @plan_doc, 
:url => portal_plan_document_update_path, 
:html=>{:method => "POST"}, :remote => true do |f| %> 

來確認,看看生成的HTML源代碼,並確保隱藏的「_method」字段未設置爲「put」

+0

很好的結果,還有很好的答案,日元。 – Andrew 2011-08-12 16:51:27

0

嘗試使用,而不是請:

:method => :post 

如果這不仍能正常工作,請輸遙控器的屬性,並給它一試。沒有它,它會起作用嗎?

+0

既不工作。該請求將作爲post方法進行處理,正如rails本身所證實的,它在日誌中顯示「已啓動POST/portal_plan_document/update」。 – jeremy 2011-04-01 02:00:30

0

我在將簡單應用從Rails 2升級到Rails 3時遇到同樣的問題。 As你可能會猜到我正在將所有「remote_form_for(@item)(..)」助手更新爲「form_for:item remote => true(..)」語法。

在我的情況下,該代碼從一個項目/ _new.html.erb部分:

<%= form_for :item, :remote => true do |f| %> 
<!--FIELDS--> 
<% end %> 

給了我這個錯誤:

Started POST "/items/new" for 127.0.0.1 at Fri Aug 12 18:19:23 +0200 2011

ActionController::RoutingError (No route matches "/items/new")

正如你所看到的方法是正確的「POST 「,而不是」PUT「。問題在於路由......我不知道爲什麼,但是當部分發送遠程POST方法時,Rails將POST請求路由到「/ items/new」而不是「/ items」路由。即使目的是創建一個新的「項目」,以便POST請求應該正確(和RESTfully)路由到「/項目」。

此代碼,以明確的行動和控制器,解決了這個問題:

<%= form_for :item, :remote => true, :url => { :controller => "items", :action => "create" } do |f| %> 
<!--FIELDS--> 
<% end %>