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

时间:2013-10-04 19:37:14

标签: ruby-on-rails ruby routes ruby-on-rails-4

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中生成路由?

3 个答案:

答案 0 :(得分:12)

在您的情况下,仅仅指定: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

答案 1 :(得分:11)

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

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

答案 2 :(得分: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