在我的config / routes.rb中,我有:
post "portal_plan_document/update"
rake路线确认了这一点:
$ rake routes
portal_plan_document_update POST /portal_plan_document/update(.:format) {:controller=>"portal_plan_document", :action=>"update"}
....
在我的代码中,我有:
<%= form_for @plan_doc,
:url => portal_plan_document_update_path,
:method => "POST", :remote => true do |f| %>
在我的日志文件中,我看到:
Started POST "/portal_plan_document/update" for 127.0.0.1 at 2011-03-31 18:04:37 -0400
ActionController::RoutingError (No route matches "/portal_plan_document/update"):
我迷失了,因为从这里做了什么。任何帮助将不胜感激!
我应该声明我使用的是Ruby 1.9.2和Rails 3.0.5。哦,我在更新routes.rb后重新启动了服务器(WebBrick w / rails服务器)。
杰里米
答案 0 :(得分:7)
想出来! :) 如果您有非空对象,则rails假定您要更新该对象。即,使用'PUT'而不是'POST'
要完成'PUT',rails会在表单中放入一个隐藏的输入,并带有“_method”=“put”。所以,它看起来像是一个POST,但是rails将它视为PUT。
如果你真的想要更新一个对象(它看起来像你正在做什么),PUT会更好,你应该只将路由切换到PUT。
如果(就像我一样),你正在做一些真正需要POST的事情(即,它不能安全地发送多次),你可以像这样编写form_for:
<%= form_for @plan_doc,
:url => portal_plan_document_update_path,
:html=>{:method => "POST"}, :remote => true do |f| %>
确认,查看生成的HTML源代码,并确保隐藏的“_method”字段未设置为“put”
答案 1 :(得分:0)
请尝试使用它:
:method => :post
如果这仍然不起作用,请丢失远程属性并尝试一下。没有它会有用吗?
答案 2 :(得分:0)
将Rails 2中的简单应用程序升级到Rails 3时遇到了同样的问题。 正如您可能猜到的那样,我将所有“remote_form_for(@item)(..)”帮助器更新为“form_for:item remote =&gt; true(..)”语法。
在我的情况下,来自项目/ _new.html.erb部分的此代码:
<%= form_for :item, :remote => true do |f| %>
<!--FIELDS-->
<% end %>
给我这个错误:
在8月12日星期五18:19:23为127.0.0.1开始 POST “/ items / new” +0200 2011
ActionController :: RoutingError(没有路由匹配“/ items / new”)
您可以注意到该方法是正确的“POST”,而不是“PUT”。问题在于路由......我不知道为什么但是当部分发送远程POST方法时,Rails将POST请求路由到“/ items / new”而不是“/ items”路由。即使目的是创建一个新的“项目”,所以POST请求应该正确(并且RESTful)路由到“/ items”。
此代码使用显式操作和控制器解决了问题:
<%= form_for :item, :remote => true, :url => { :controller => "items", :action => "create" } do |f| %>
<!--FIELDS-->
<% end %>