8

我有一个 button_to,我想执行 PUT 操作(关于此资源,只有一件事可以更新 - 它将被更新为“已确认”,因此没有其他与触发该操作相关的表单字段)。

这是在我看来(控制器是明确给出的,因为按钮位于属于另一个控制器的视图上):

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

在我的路由文件中,该资源已被声明为 restful 资源:

  resources :practice_sessions

这个资源的控制器有一个 create 和一个 update 动作,上面的 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"}
4

3 回答 3

19

您的语法略有偏差。 button_to接受三个参数:按钮标题、options哈希和html_options哈希。:method=>:put需要进去html_options,而路由参数需要进去options。所以你可以像这样重写:

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

单击时,请求应由PracticeSessionsController#update

于 2010-11-16T21:02:35.073 回答
2

最后,我决定采用更安静的方法,使用命名路由,这似乎工作正常。我仍然不能 100% 确定为什么其他方法不起作用,但我认为这并不重要,因为这看起来既 a)更整洁,又 b)更传统。

<%= button_to "Acknowledge", practice_session_path(@practice_session), :method => :put %>
于 2010-11-17T06:35:30.950 回答
1

您可能需要:method => :put在哈希中显式传递参数html_options- 它可能会被纳入哈希中options

尝试这个:

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

:controller(注意和周围的显式大括号:id

于 2010-11-16T21:04:21.363 回答