简单的Rails 3路由失败 - 没有路由匹配

时间:2011-03-31 22:34:47

标签: ruby-on-rails-3 routing

在我的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服务器)。

杰里米

3 个答案:

答案 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 %>