【问题标题】:Strange routing error in Rails 3.0.1Rails 3.0.1 中的奇怪路由错误
【发布时间】:2023-03-30 10:02:01
【问题描述】:

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

我在 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,控制器:广告)也存在。
  • 所有其他路线都运行良好
  • 我已尝试多次重启服务器
  • 我仔细检查了它实际上是一个 POST 请求,ID 是否正确,我真的不知道该怎么办了。
  • Rails 版本是 3.0.1

--- 更新 ---

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

不过,我想知道为什么。我确实知道 POST 用于创建成员,因此对成员的 POST 请求没有意义,但我在 Rails 指南中的任何地方都没有发现这一点,为什么rake routes 会显示路线,如果没有' t实际工作?这是一个错误吗?

--- 更新 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 或 delete。如果 您没有多个成员路线, 您还可以将 :on 传递给路线, 消除阻塞 [...]

那么会员上的 POST 是可能的还是不可能的?我错过了什么吗?只是说清楚,我不想再使用它了,但是,它仍然让我不知道为什么它不起作用。

【问题讨论】:

  • 同样的问题一直让我发疯……有什么解决办法吗?
  • 遇到了同样的问题 - 在 routes.rb 中使用 PUT 而不是 POST 修复了它。奇怪的是,在 form_for 中使用此路由的路径确实使用了 POST 方法。有什么想法吗?

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


【解决方案1】:

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

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

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

---编辑---

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

【讨论】:

    【解决方案2】:

    应该可以。我用 3.0.1 创建了一个空白应用程序并添加了这些路由,它工作正常。

    您是否尝试过传递 :on 参数?比如:

    resources :ads do
      post :preview_revision, :on => :member
      get :revise, :on => :member
    
      get :search, :on => :collection
      post :preview, :on => :collection
    end
    

    【讨论】:

    • 是的,这就是我最初尝试的方法,但也没有用。
    • 请求页面的表单中没有名称为“_method”的隐藏输入标签 - 也许这有所作为。但它仍然是一个 POST 请求。
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多