Как сопоставить хэш (глубоко вложенные) параметры в Rails3, чтобы получить красивый URL? - PullRequest
1 голос
/ 13 сентября 2011

Если у меня есть этот маршрут (в route.rb):

match 'posts', :to => 'posts#index'

Он покажет и сопоставит следующие маршруты:

# Case 1: non nested hash params
posts_path(:search => 'the', :category => 'old-school')
#=> "/posts?search=the&category=old-school"

# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts?filter[search]=the&filter[category]=old-school"

Если я хочу сделать параметр категории параметромчасть основного URL, я мог бы сделать это для Case 1 .

match 'posts(/:category)', :to => 'posts#index'

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

# Case 1: non nested hash params
posts_path(:search => 'the', :category => 'old-school')
#=> "/posts/old-school?search=the"

Но какМогу ли я сделать то же самое, если параметр вложен ( Случай 2 )?

Я бы ожидал, что следующее определение маршрута:

match 'posts(/:filter[category])', :to => 'posts#index'

будет работать следующим образом:

# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts/old-school?filter[search]=the"

Но это не работает.

Я нашел этот же вопрос в двух местах без правильного ответа:

Rails Guides не указывайте муравьи по этому поводу.

Должен ли я предположить, что это не может быть сделано в рельсах?на самом деле?

1 Ответ

0 голосов
/ 18 января 2012

вместо этого вы можете просто сделать два разных маршрута

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"

Это нормально делать так.

Если вы хотите сохранить категорию сообщений /: просто используйте это только для навигации, а не для поиска.

Надеюсь, это поможет

...