Как два маршрута с разными типами запросов HTTP имеют одно и то же имя?
В 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 жалуется на эту конфигурацию:
Недопустимое имя маршрута, уже используемое: "контакт". Возможно, вы определили два маршрута с тем же именем, используя опцию :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
Ответ 2
Если эти два маршрута имеют один и тот же URL-адрес, вам не нужно указывать второй. Таким образом, следующее должно работать:
get 'contact' => 'contact#new', :as => 'contact'
post 'contact' => 'contact#create'
Ответ 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