在form_for动作中传递id

时间:2012-01-03 14:43:14

标签: ruby-on-rails ruby-on-rails-3

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

<% 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 - 我没有收到路由错误。

知道为什么我不能这样做吗?

2 个答案:

答案 0 :(得分:4)

除了Frederick Cheung关于GET vs 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|

如果/当您重构应用时,将来更容易更改。

答案 1 :(得分:1)

如果您通过在网址栏中输入网址来转到网址,则表示您正在发出GET请求,而默认情况下表单会发出POST个请求,在这种情况下可能会发出{{} {1}}请求(因为您正在对现有记录采取行动)。

听起来您的路线只是路由PUT次请求。鉴于您说自定义操作确实更新了记录,听起来您应该更新路由以接受GET请求。