2010-11-16 17 views
6

我有一個button_to,我想執行一個PUT動作(只有一件事可以更新關於這個資源 - 它將被更新爲'已確認' ,所以沒有其他表單字段與觸發該動作相關聯)。Rails3 button_to正在調用POST動作,試圖調用PUT動作

這是我的看法(控制器被明確給出,因爲按鈕是屬於另一個控制器視圖):

<%= button_to "Acknowledged", :controller => 'practice_sessions', :id => @practice_session.id, :method => :put %> 

在我的路線文件,資源已被宣佈爲REST資源:

resources :practice_sessions 

此資源的控制器具有創建和更新操作,上面的button_to調用create操作。我希望它調用更新操作。

這都在日誌中創建行動火災前右:

Started POST "/practice_sessions?id=21&method=put" for 127.0.0.1 at 2010-11-17 08:52:46 +0000 
    Processing by PracticeSessionsController#create as HTML 
    Parameters: {"authenticity_token"=>"1EW0IlI38d0f4wST5azrCEZVZPfih7i0UvCGSF7eqbc=", "id"=>"21", "method"=>"put"} 

回答

17

你的語法稍微偏離。 button_to需要三個參數:按鈕標題,options散列和html_options散列。 :method=>:put需要進入html_options,而路由參數需要進入options。所以,你可以重寫,像這樣:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', 
    :id => @practice_session.id}, 
    :method => :put %> 

當點擊請求應該由PracticeSessionsController#update

+0

嗨,謝謝你。我現在正在'沒有路線匹配「/ practice_sessions」'。我認爲這是因爲在這種情況下,它只是針對/ practice_sessions(正如URL http:// localhost:3000/practice_sessions?id = 26所示)而不是/ practice_sessions/26。我會繼續玩,但任何提示讚賞! – pakeha 2010-11-17 00:12:00

+0

'rake routes'的輸出是什麼? – zetetic 2010-11-17 00:19:01

+0

看起來如預期。下面是我想象是感興趣的行: practice_session PUT /practice_sessions/:id(.:format){:行動=> 「更新」,:控制器=> 「practice_sessions」} practice_sessions POST/practice_sessions(。 :format){:action =>「create」,:controller =>「practice_sessions」} – pakeha 2010-11-17 06:22:23

1

您可能需要顯式傳遞:method => :put參數在html_options哈希處理 - 它可能會得到晶片被保護到options哈希。

試試這個:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', :id => @practice_session.id }, :method => :put %> 

(注意周圍:controller:id明確的大括號)

+0

嘿,這對我不起作用(請參閱我對zetetic的回答),但是我最終使用命名路線解決了它(請參閱我的答案)。感謝您的意見 - 儘管如此,我應該注意到單獨的論點。 – pakeha 2010-11-17 06:38:32

1

最後,我決定去使用命名路由的更多休息的辦法,這似乎很好地工作。我仍然不能100%確定爲什麼其他方法不起作用,但我不認爲這很重要,因爲這看起來既a)更整潔,b)更傳統。

<%= button_to "Acknowledge", practice_session_path(@practice_session), :method => :put %>