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

18

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个回答

19
在您的情况下,只需不指定: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

2
我花了很长时间寻找这个:as => nil的方法。 - marcinowski

12
如果这两条路由的 URL 相同,你不需要给第二个命名。因此,下面的代码应该是可行的:

如果这两个路由有相同的URL,则不需要给第二个路由命名。因此,以下代码应该可以工作:

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

2
如果您将路由命名为不同的 as,例如 get 'contact' => 'contact#new', :as => 'some_other_thing',那么它就不会被继承,这是无效的。 - Yuval Karmi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接