具有不同 HTTP 请求类型的两条路由如何共享相同的名称?

Posted

技术标签:

【中文标题】具有不同 HTTP 请求类型的两条路由如何共享相同的名称?【英文标题】:How may two routes with different HTTP request types share the same name? 【发布时间】:2013-10-11 22:27:04 【问题描述】:

Rails 3.2 我正在使用这些路由声明:

get 'contact' => 'contact#new', :as => 'contact'
post 'contact' => 'contact#create', :as => 'contact'

它们导致 (rake routes):

contact_en GET    /en/contact(.:format)    contact#new :locale=>"en"
contact_de GET    /de/kontakt(.:format)    contact#new :locale=>"de"
contact_en POST   /en/contact(.:format)    contact#create :locale=>"en"
contact_de POST   /de/kontakt(.:format)    contact#create :locale=>"de"

现在 Rails 4.0 抱怨此配置:

无效的路由名称,已在使用:'contact' 您可能已经定义 使用:as 选项的两条同名路线,或者您可能是 覆盖已由具有相同资源的资源定义的路由 命名。

显然这些路由名称相同,但由于请求类型不同,我希望它们像以前一样被接受。

如何让 Rails 4 像以前在 3.2 中一样生成路由?

【问题讨论】:

【参考方案1】:

在您的情况下,只需不指定 :as 选项就足够了,因为 Rails 会自动从路径中获取路由名称:

get 'contact' => 'contact#new'
post 'contact' => 'contact#create'

但是,如果您有更复杂的路径模式或想要引用具有不同名称的路由,那么您应该专门将第二个路由设置为 :as => nil(或使用新哈希语法的 as: nil)。

因此,如果您想将路线命名为 person_path,您需要这样做:

get 'contact' => 'contact#new', :as => 'person'
post 'contact' => 'contact#create', :as => nil

【讨论】:

我一直在期待这个:as => nil【参考方案2】:

如果这两个路由具有相同的 URL,则无需命名第二个。所以以下应该工作:

get 'contact' => 'contact#new', :as => 'contact'
post 'contact' => 'contact#create'

【讨论】:

如果您将路线命名为不同的 as,则无效,例如,get 'contact' => 'contact#new', :as => 'some_other_thing' -- 不会被继承【参考方案3】:

您为什么使用 :as ?在这种情况下似乎不需要。

get 'contact' => 'contact#new'
post 'contact' => 'contact#create'

给予

Prefix Verb URI Pattern        Controller#Action
contact GET  /contact(.:format) contact#new
        POST /contact(.:format) contact#create

【讨论】:

以上是关于具有不同 HTTP 请求类型的两条路由如何共享相同的名称?的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 如何显示具有相同 y 但不同 x 的两条不同的回归线

Gradle 设置以处理具有相同代码库但依赖项不同的两种部署类型

SQL 如何将一个表中的两条或多条拥有相同ID的记录合并为一条?

GCDWebServer中不同本地资源的两条路径

具有不同输出的类似 Express 路由请求

连接具有相同标题但在不同表中的两列