我正在尝试编辑表单,路由是控制器/ id /操作以进行编辑,例如
人/ 124321 /编辑
我正在尝试使用此代码将此表单提交给更新操作:
<% form_for :probe, @probe, :action => "update" do |f| %>
...
...
...
<%= submit_tag 'Submit' %>
<% end %>
当我点击提交时,它会给我一个错误说明
未知行动。 没有采取任何行动(id)。
修改
我为探针指定的路由中唯一的东西是map.resources:probes
当我生成控制器时,RoR只是自己做了/ 124321 /编辑。
Rake路线显示此
probes GET /probes(.:format) {:controller=>"probes", :action=>"index"}
POST /probes(.:format) {:controller=>"probes", :action=>"create"}
new_probe GET /probes/new(.:format) {:controller=>"probes", :action=>"new"}
edit_probe GET /probes/:id/edit(.:format) {:controller=>"probes",action=>"edit"}
GET /probes/:id(.:format) {:controller=>"probes", :action=>"show"}
PUT /probes/:id(.:format) {:controller=>"probes", :action=>"update"}
DELETE /probes/:id(.:format) {:controller=>"probes", :action=>"destroy"}
编辑2个探测控制器
def edit
@probe = Probe.find(params[:id])
end
def update
@probe = Probe.find(params[:id])
debugger
if @probe.update_attributes(params[:probe])
flash[:notice] = "Successfully updated probe."
redirect_to probes_path
else
render :action => 'edit'
end
end
答案 0 :(得分:3)
很难准确地说,因为你已经发布了很少的问题支持细节,但我的猜测是你的路线文件被设置为匹配:controller/:action/:id
匹配的东西的优先级出现在你的路线之前瞄准,:controller/:id/:action
。
路线自上而下评估,首次匹配胜利。
我也会回应约翰的回答。您不需要指定:action => 'update'
,事实上这些天我通常会将new.html.erb
和edit.html.erb
中的表单提取到部分_form.html.erb
中。 form_for
将根据情况确定对象是否为新记录并发布到create
或update
操作。
我看到过去在开发模式下重新加载路由更改的一些情况会混淆路由代码,这通常是通过重新启动服务器来修复的。
rake routes
也是一个很好的调试工具。检查页面源以查看Rails用于表单action
属性的内容,然后向下扫描rake routes
的输出以查看请求最终的位置。
答案 1 :(得分:2)
如果您正在使用RESTful资源,那么您应该能够这样做:
<% form_for(@probe) do |f| %>
.
.
.
<%= f.submit 'Submit' %>
<% end %>
Rails可以判断您是创建新记录还是更新现有记录。有关详细信息,请参阅Binding a Form to an Object。
另外,请注意我的示例中使用f.submit
。 *_tag
帮助者会聚在一起,因此您通常不会看到form_for
帮助submit_tag
。
答案 2 :(得分:0)
“未知行动。没有任何行动回应(身份证)。”听起来像路由问题。
您是否删除或删除了routes.rb文件中的默认路由?
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
如果正在运行默认路由,它可能会交换操作的ID吗?