Rails 3.0.1中的奇怪路由错误

时间:2010-11-15 17:25:21

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

这让我很恼火,而且我已经待了一个多小时了。也许你们其中一个人有一个想法。

我在routes.rb中定义了以下路由:

resources :ads do
  member do
    post :preview_revision
    get :revise
  end
  collection do
    get :search
    post :preview
  end
end

当我运行rake routes时,正确显示了preview_revision路线:

preview_revision_ad POST   /ads/:id/preview_revision(.:format) {:action=>"preview_revision", :controller=>"ads"}

但是,当我向/ ads / 145 / preview_revision发出POST请求时,出现以下错误:

Started POST "/ads/145/preview_revision" for 127.0.0.1 at Mon Nov 15 17:45:51 +0100 2010

ActionController::RoutingError (No route matches "/ads/145/preview_revision"):


Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.2ms)
  • id(145)存在,是的。
  • 操作和控制器(操作:preview_revision,controller:ads)也存在。
  • 所有其他路线都完美无缺
  • 我已多次尝试重启服务器
  • 我仔细检查了它实际上是一个POST请求,ID是否正确,我真的不知道该怎么办。
  • Rails版本是3.0.1

---更新---

我尝试将方法从POST更改为PUT,现在它可以正常工作。显然,成员级别的POST路由不起作用,或者不允许。

不过,我想知道原因。我知道POST是用于创建成员的,因此对成员的POST请求没有意义,但我没有在Rails指南中的任何地方找到这个,为什么rake routes会显示路由,如果它实际上没有用?这是一个错误吗?

---更新2 ---

Rails路由指南(Edge版)具体说:

  

2.9.1添加成员路由

     

要添加成员路线,只需添加一个   成员块进入资源块:

resources :photos
  do   member do
    get 'preview'
  end
end

     

这将识别/ photos / 1 / preview   使用GET,并路由到预览   PhotosController的动作。它会   还创建了preview_photo_url和   preview_photo_path助手。

     

在会员路线的范围内,   每个路由名称指定HTTP   它会识别的动词。您可以   使用get,put,发布,或在此处删除。如果   你没有多条成员路线   你也可以通过:路线,   消除块[...]

成员的POST可能或不可能吗?我错过了什么吗?为了清楚起见,我不想再使用它,但是,它仍然让我不知道为什么它不起作用。

2 个答案:

答案 0 :(得分:1)

如果您在积极维护的开源软件中发现错误,最好的办法是:

  • 向项目的错误跟踪器提交错误报告,尽可能地尽可能详细地隔离问题,并且可选地,
  • 如果可以,
  • 包含修复错误的补丁。

Rails的错误跟踪器位于rails.lighthouseapp.com

--- ---编辑

Rails的错误跟踪器现在位于github.com/rails/rails/issues

答案 1 :(得分:0)

这应该有效。我用3.0.1创建了一个空白的应用程序,并添加了这些路线,但它确实有效。

你试过传递:on param吗?类似的东西:

resources :ads do
  post :preview_revision, :on => :member
  get :revise, :on => :member

  get :search, :on => :collection
  post :preview, :on => :collection
end