我有一个button_to,我想执行PUT操作(只有一件事可以更新有关此资源 - 它将被更新为'已确认',因此没有其他表单字段与触发相关联行动)。
这是在我的视图中(控制器是明确给出的,因为按钮位于属于另一个控制器的视图上):
<%= button_to "Acknowledged", :controller => 'practice_sessions', :id => @practice_session.id, :method => :put %>
在我的路线文件中,资源已被声明为一个宁静的资源:
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"}
答案 0 :(得分:18)
您的语法略有偏差。 button_to
有三个参数:按钮标题,options
哈希值和html_options
哈希值。 :method=>:put
需要进入html_options
,而路由参数需要进入options
。所以你可以像这样重写:
<%= button_to "Acknowledged", { :controller => 'practice_sessions',
:id => @practice_session.id},
:method => :put %>
点击后,请求应由PracticeSessionsController#update
答案 1 :(得分:2)
最后我决定采用更加安静的方法,使用命名路线,这似乎工作正常。我仍然不能100%确定为什么其他方法不起作用,但我认为这不重要,因为这似乎a)更整洁,b)更传统。
<%= button_to "Acknowledge", practice_session_path(@practice_session), :method => :put %>
答案 2 :(得分:1)
您可能需要在:method => :put
哈希中显式传递html_options
参数 - 它可能会被整合到options
哈希中。
试试这个:
<%= button_to "Acknowledged", { :controller => 'practice_sessions', :id => @practice_session.id }, :method => :put %>
(请注意:controller
和:id
)