2010-11-16 15 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 %>