我有一个表单来更新模型的属性 - 我不希望它转到标准的更新操作,我希望它转到不同的操作。
<% 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 - 我没有收到路由错误。
知道为什么我不能这样做吗?
答案 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
请求。