Маршрутизация более одного действия к одному контроллеру и действию - PullRequest
4 голосов
/ 09 июля 2011

Я пытаюсь заставить что-то подобное работать в моем приложении на Rails:

match '/:language', :to => 'posts#search_result'
match '/:tag', :to => 'posts#search_result'
match '/:language/:tag', :to => 'posts#search_result'

Я использую это действие search_result для фильтрации некоторых сообщений в зависимости от языка и тега.

Проблема в том, что иногда: тег будет ноль или: язык будет ноль;так что у меня есть 3 возможности при вызове действия:

<%=link_to "Spanish", {:controller => 'posts', :action => 'search_result', :language => "spanish"} %>

<%= link_to "Spanish", {:controller => 'posts', :action => 'search_result', :language => "spanish", :tag => @tag} %>

<%=link_to "#{tag.name}", {:controller => 'posts', :action => 'search_result', :tag => @tag} %>

И я ожидаю, что URL-адреса будут такими:

/spanish          (for the first case)
/spanish/rails    (where rails is a tag, for the second case)
/rails            (for the third case)

Но сейчас я получаю правильную вещь для первогои третий случай, но для второго случая я получаю: / spanish? tag = rails или снова / spanish (в зависимости от того, выбрал ли я сначала тег или язык первым).

Надеюсь, я все правильно объяснил.Любая идея??.спасибо!.

Ответы [ 2 ]

3 голосов
/ 09 июля 2011

Маршрутизатор не может определить разницу между: language и a: tag.

Только потому, что ваши маршруты говорят "language" и "tag", когда вы создаете свой код в представлении ... помните, что вHTML-код, который был переведен в простые URL-адреса, например / spanish или / rails

, маршрут должен быть определен по этому URL.

Теперь, как я уже сказал, маршрутизатор может 'не говорите, что конкретное слово является языком или тегом ... и на обычном URL-адресе больше нет слова "тег" или "язык" ... так что ваши двамаршруты здесь:

match '/:language', :to => 'posts#search_result'
match '/:tag', :to => 'posts#search_result'

оба являются одинаковыми типом URL

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

/greek
/spanish
/rails
/urdu
/whatever

Они будут all соответствовать первому маршруту, который соответствует "одному токену после косой черты" ... что означает ваш маршрутизаторсопоставит их все с маршрутом «language» и никогда не будет соответствовать маршруту «/: tag», потому что он уже сопоставлен с маршрутом выше.

he he: все по-гречески к маршрутизатору;)

Редактировать:

Привет, это очень помогает мне понять, как работает маршрутизация ... но все же я не могу видеть это ясно.Я понимаю, что вы сказали, и поэтому в основном я понимаю, что я должен сделать что-то вроде match '/ tags /: tag, чтобы, по крайней мере, только маршрутизировать к публикациям # search_result URL-адреса, начинающиеся с / tag .. что было бы решением ??

да, "/ tags /: tag" будет понятным и недвусмысленным, но если вы хотите, чтобы он был действительно гибким в языке tag против языка, вам лучше обойтись простым:

match '/posts/search', :to => 'posts#search_result'

который может использовать любой из приведенных выше примеров link_to для генерации, например:

/posts/search?tag=rails
/posts/search?language=spanish
/posts/search?language=spanish&tag=rails

Также гораздо яснее, что передается, и почему .

Описаниетретий URL-адрес: «Я ищу набор сообщений, которые имеют language = spanish и tag = rails»

Ваш URL должен отражать ресурс (который в данном случае является наборомсообщений) все остальное лучше сделать в виде параметров запроса.

3 голосов
/ 09 июля 2011

Вместо отдельного определения тега /: language и /: language /: определите их вместе с тегом /: в качестве необязательного элемента URI.

match '/:language(/:tag)', :to => 'posts#search_result'

Я считаю, что маршруты совпадают (и генерируются URI).из них) в том порядке, в котором определены маршруты.Вы определили /: lang до того, как определили тег /: lang /:, поэтому он соответствует /: lang и сделал: тег GET-параметром.Я полагаю, вы могли бы оптимизировать порядок своих определений, но я считаю, что использование вышеуказанного синтаксиса является предпочтительным методом.

...