вместо этого вы можете просто сделать два разных маршрута
match 'posts', :to => 'posts#index'
match 'posts/:category', :to => 'posts#index'
Следующий маршрут не будет работать так, как вы предполагали.
match 'posts(:filter[category])', :to => 'posts#index'
Фильтр: является просто заполнителем для любого из них.первый аргумент, который передается в хелпер url или значение для ключа: filter в a has, который передается. Любые выражения в строке маршрута не будут оцениваться.
Я полагаю, ответ на ваш вопросчто вы не можете сделать это в рельсах.Я хотел бы предложить вам, что вы делаете это по-другому.На рельсах очень полезно следовать соглашению и облегчить себе жизнь.
Похоже, вы здесь делаете три вещи.Маршруты базовой почты
match 'posts', :to => 'posts#index'
Маршрут с вложенной категорией.Скорее всего, дать пользователю лучший URL
match 'posts/:category', :to => 'posts#index'
И поисковый URL, который может быть таким же, как первый, или сделать ваше действие более чистым, другой
match 'posts/search', :to => 'posts#search'
На самом деле я не могу думать о том, чтобы усложнять маршруты так, как вы предлагаете.URL поискового запроса в любом случае выглядит не очень хорошо, так что зачем искать два URL для поиска.Это будет делать только один.
Вы обязательно должны взглянуть на выполнение
rake routes
, поскольку это точно скажет вам, что вы определили в файле маршрутов.Вы также можете настроить тесты маршрутизации, чтобы убедиться, что ваши пользовательские маршруты работают правильно.
Ваш пример не работает (как вы указали)
# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts/old-school?filter[search]=the"
Но вот что вам нужно искать, так это
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts?filter[search]=the&filter[category]=old-school"
Это нормально делать так.
Если вы хотите сохранить категорию сообщений /: просто используйте это только для навигации, а не для поиска.
Надеюсь, это поможет