2014-11-05 1 views
0

По Rails 4.2, я не могу сделать следующее:Rails же названный маршрут, но с параметром вызывает ошибку

get 'profile', to: 'profile#index', as: 'profile' 
    get 'profile/:slug', to: 'profile#show', as: 'profile' 

, потому что это поднимет ошибку говоря маршрут уже определен. Почему это? Очевидно, что profile_path и profile_path(User.last.slug) не совпадают, и не должно быть никаких трудностей с их дифференциацией, даже если они имеют одно и то же базовое имя (вы проверяете, прошел ли параметр).

Мысли?

+0

Почему бы не определить параметр «слизняк» в качестве дополнительного, а затем вы можете объединить оба? Конечно, с некоторой логикой в ​​контроллере. Я думаю, что ошибка, о которой вы говорите, имеет основание быть, по-видимому, два действия для разных вещей, почему они должны иметь одно и то же имя ?. –

ответ

2

В рельсах, помощник названия различных маршрутов должно быть разным. И, следовательно, как вы правильно поняли, вы получите сообщение об ошибке, если используете одно и то же имя помощника (т. Е. Как: «профиль» в вашем случае) для двух разных маршрутов.

Это ограничение в Rails помогает поддерживать разумность в файле routes.rb, а также в вашем приложении. Например рассмотрим два метода контроллера:

class XyzController < ApplicationController 
    def method_a(param1) 
    end 

    def method_b(param1) 
    end 
end 

В маршрутах файл, если не было никаких ограничений держать вспомогательные имена разные, вы могли бы использовать:

get 'xyz/method_a', to: 'profile#method_a', as: 'profile_method' 
get 'xyz/method_b', to: 'profile#method_b', as: 'profile_method' 

Соответственно в файле вида:

Как видно, в файле вида не просто определить, какой маршрут предназначен для какого метода, его также невозможно маршрутизировать в любой другой элемент управления er, используя вспомогательный метод 'profile_method', за исключением метода, который первым использует этот помощник в вашем файле route.rb (поскольку маршруты читаются последовательно).

Надеется, что это помогает :)

+0

В итоге я использовал разные именованные маршруты. –

0

Для обоих маршрутов вы указали as: 'profile', и это ваша проблема здесь. Кроме того, использовать множественные имена маршрутов для #index действия, например:

get 'profiles', to: 'profile#index' 
Смежные вопросы