【问题标题】:Matching same route / different HTTP verb to different controller method in Rails将相同的路由/不同的 HTTP 动词匹配到 Rails 中的不同控制器方法
【发布时间】:2014-06-11 12:55:03
【问题描述】:

我有一个 Rails 3 应用程序,而不是默认的销毁映射:

modelname DELETE         /modelname/:id           modelname#destroy

我想要一个带有GET“后备”的专用路由,以便将没有 Javascript 的用户发送到确认页面:

delete_modelname DELETE  /modelname/:id/delete    modelname#destroy
delete_modelname GET     /modelname/:id/delete    modelname#confirm_destruction

我可以通过以下声明在rake routes 中获得上述输出:

resources :modelname, except: [:destroy] do
  member {
    get 'delete', to: 'confirm_destruction'
    delete 'destroy', as: 'delete'
  }
end

但是,其中一条路由不匹配,而且它似乎与顺序有关,即先定义的路由在测试中不匹配。我注意到 Rails 生成的默认“重载”路由在 rake routes 中看起来有点不同:

modelnames GET          /modelname/:id/delete    modelname#index
           POST         /modelname/:id/delete    modelname#create

路由名称不重复,指向create 的链接将在表单或启用Javascript 的请求之外变成指向index 的链接。

看来我已经定义了两条完全不同的路径,共享相同的名称,而不是像我想要的那样重载路径。

我错过了什么?有什么方法可以达到我想要的效果吗?

我尝试过的事情

因为它似乎是冲突的路线 name,所以我尝试了这个:

member {
  get 'delete', to: 'confirm_destruction'
  delete 'destroy', path: 'delete'
}

as: 更改为path:,这样路由名称不会受到影响,但路径会匹配。这行得通!生成以下路由:

delete_modelname GET     /modelname/:id/delete    modelname#confirm_destruction
modelname DELETE         /modelname/:id/delete    modelname#destroy

这给出了我想要的效果,但不幸的是 modelname DELETE 路由掩盖了默认的 modelname PUT 路由以进行更新。

【问题讨论】:

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


    【解决方案1】:

    好的,所以有一种方法可以做到这一点,但它并不像我希望的那样优雅。如果有人有更好的答案,我非常愿意接受。

    resources :modelname, except: [:destroy] do
      member {
        get 'delete', to: 'confirm_destruction'
        delete 'destroy', as: 'destroy', path: 'delete'
      }
    end
    

    之所以有效,是因为这两个新路由具有在视图中使用的唯一名称——delete_modelname_pathdestroy_modelname_path——但如果禁用 Javascript,destroy_modelname 路径仍然是 /modelnames/:id/delete,它以 @987654326 的形式出现@request 和 Rails 将其匹配到 delete_modelname 路由(即确认页面)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 2013-09-24
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2017-04-05
      • 2016-10-03
      相关资源
      最近更新 更多