2012-01-03 95 views
1

我有一个表单来更新模型的属性 - 我不希望它转到标准更新操作,我希望它转到不同的操作。在form_for action中传递id

<% for car in @cars %> 
<%= form_for car, :url => { :action => "custom_action/#{car.id}" } do |f| -%> 

这是给下面的错误 -

No route matches {:action=>"custom_action/1", :controller=>"cars"} 

但是,如果我访问的URL - custom_action/1 - 我没有得到路由错误。

任何想法,为什么我不能这样做?

回答

3

除了Frederick Cheung对GET和POST与PUT的说法之外,我认为你的代码可能是错误的。

做的正是你想要的东西,尝试:

form_for car, :url => {:action => "custom_action", :id => car, :controller => "cars"} do |f| 

我不认为这是一个好主意,并可能会引起你痛苦。我建议看看Ruby on Rails Routing Guide,了解如何正确地做到这一点。 (路由是一个话题,我总是要咨询手册)。

有了正确的路由你的代码应该是这个样子:

form_for car, custom_action_car_path(car) do |f| 

,这将是更容易在未来的改变,如果/当你重构你的应用程序。

+0

非常感谢 - 现在查看路线。 – Finnnn 2012-01-03 15:24:49

+0

在你的路线中,你会想要一些像资源:汽车; post:custom_action,:on =>:member;那么你可以在你的控制器和视图中使用'custom_action_cars_path(car)'。 – 2012-01-03 15:31:58

1

如果你去到URL通过键入到地址栏,你正在做一个GET请求,而形式发出默认POST的要求,在这种情况下可能会发出PUT请求(因为你表现在现有记录上)。

这听起来像你的路线只是路由GET请求。假设您说自定义操作确实更新了记录,则听起来您应该更新路由以接受PUT请求。

+0

谢谢,这是有道理的。按照Ryan的回答,我会尝试对我的路线进行排序。 – Finnnn 2012-01-03 15:24:18