【发布时间】: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