2015-04-07 6 views
9

Я пытаюсь создать маршрут Rails, который имеет необязательные параметры, а также различный порядок.Rails 3 Маршрут с несколькими необязательными параметрами

Этот вопрос описывает подобную проблему: Routes with multiple, optional, and pretty parameters

Я пытаюсь создать маршруты, которые имеют карты фильтров в них, как и параметры, но без параметра URL стиля. Идея заключается в том, чтобы они выглядели как

/search/country/:country/ 
/search/country/:country/state/:state/ 
/search/country/:country/state/:state/loc/:lat/:long/ 

но вы также должны иметь возможность искать с

/search/state/:state/ 
/search/state/:state/country/:country/ 
/search/loc/:lat/:long/ 

Я знаю, что я мог бы написать сложные операторы регулярных выражений с маршрутом подстановки - однако мне интересно, если существует способ иметь несколько необязательных параметров маршрута с неуказанным порядком, что-то вроде

/search/((/country/:country)(/state/:state)(/loc/:lat/:long)) 

Спасибо!

+0

Я думаю, что у вас уже есть лучшее решение для вашей проблемы т.е. регулярных выражений – RAJ

+0

Другим способом, может быть, не лучшим, было бы просто иметь несколько записей в вашем 'routes.rb' – RPinel

+0

Я использовал Regex для решения этой проблемы, но мне все же интересно, есть ли желание, чтобы протокол Rails5 поддерживал несколько необязательных параметры. Вы должны иметь возможность указать разделитель (ы) и выбирать между явным и недооцененным. –

ответ

2

Вы можете использовать constraints с лямбда использовать несколько вариантов поиска:

search_options = %w(country state loc) 
    get('search/*path',:to => 'people#search', constraints: lambda do |request| 
      extra_params = request.params[:path].split('/').each_slice(2).to_h 
      request.params.merge! extra_params # if you want to add search options to params, you can also merge it with search hash 
      (extra_params.keys - search_options).empty? 
      end) 

Вы можете сделать различные лямбда для более сложных маршрутов

+1

Спасибо, это кажется хорошим/правильным решением проблемы. Я полагаю, что в конце концов, это сводится к регулярному выражению в сложной лямбде, как вы сказали, надеюсь, что они добавят легко несколько дополнительных параметров в Rails 5! –

Смежные вопросы